2D レンダリングに Qt + OpenGl を使用しています。私は OpenGL の初心者であり、一生このアスペクト比の問題を理解できません。glOrtho と gViewPort を理解していると思うたびに、次回は別の問題に直面します。座標が-1と1の間のように対称である場合、私のコードは機能しますが、そうでない場合は機能しません。これらを一度は乗り越えたいと思っています。私が検索して適用したすべての提案は、私にとって無駄になりました。
私の問題声明:
私は正方形と三角形をレンダリングしており、キーストローク「R」でそれらを切り替えます。私もズームインとズームアウトしています。正方形はアスペクト比を維持していますが、三角形はそうではありません。形状の座標は次のとおりです。
正方形: (-10, -250), (500, -250), (500, -260), (-10, -260);
三角形: (250, 0)、(310, 0)、(280, 30)
基本的に三角形の上はレンダリングできません。同じコードは次のとおりです。
マイコード
#include <QtGui/QMouseEvent>
#include <qdebug.h>
#include "GLWidget.h"
#include "stdio.h"
#include "qgl.h"
#include "qimage.h"
GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent)
{
setMouseTracking(true);
}
void GLWidget::initializeGL()
{
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glEnable(GL_POLYGON_SMOOTH);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(1, 1, 1, 0);
glEnable( GL_POINT_SMOOTH ); // For Circular Points
}
void GLWidget::resizeGL(int w, int h)
{
canvas_width = (double)w;
canvas_height = (double)h;
aspect_ratio = canvas_width/canvas_height;
left_plane = 250;
right_plane = 310;
bottom_plane = 0;
top_plane = 60;
z_near_plane = 1;
z_far_plane = -1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if( canvas_width > canvas_height ){
glOrtho(left_plane*aspect_ratio, right_plane*aspect_ratio, bottom_plane, top_plane, z_near_plane, z_far_plane);
}else{
glOrtho(left_plane, right_plane, bottom_plane/aspect_ratio, top_plane/aspect_ratio, z_near_plane, z_far_plane);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0); // red
glBegin(GL_POLYGON);
//glVertex2f(-30,0);
//glVertex2f(30,0);
//glVertex2f(0,60);
glVertex2f(250,0);
glVertex2f(310,0);
glVertex2f(280,60);
glEnd();
}
left_plane*aspect_ratio が描画をクリップするため、トレイングルは表示されません (250 が最小 X、250*1.4 > 310、310 が最大 X)。
私は自分自身を明確にしたことを願っています。
画像も配置しようと思います (画像を他のサイトにアップロードしてここにリンクする必要があると思いますか?)。