我正在使用Qt和OpenGL(更具体地说,QGLWidget)用C ++编写台球游戏。我在某种程度上了解OpenGL,但不是太专业。
我做了什么: 使用Qt小部件(按钮,...)和QGLWidget(我自己的实现)创建一个Qt应用程序窗口。
问题: 我可以在这个窗口画一个球并旋转它,等等但是视图的宽高比不正确+我似乎无法使用整个空间。
白色矩形是比赛场地(测量值:浮点坐标为1.4 x 2.7)
我可以改造模型但是它似乎被切断了:
一旦我转换视图(检查下面的功能),我的模型的一部分似乎被切断了。
这是矩形(在这些坐标内正确绘制球):
glBegin(GL_LINE_LOOP);
glColor3f(255.0, 255.0, 255.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(1.4, 0.0, 0.0);
glVertex3f(1.4, 0.0, 0.0);
glVertex3f(1.4, 2.7, 0.0);
glVertex3f(1.4, 2.7, 0.0);
glVertex3f(0.0, 2.7, 0.0);
glVertex3f(0.0, 2.7, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glEnd();
OpenGL调整大小功能:
void GLWidget::resizeGL( int width, int height )
{
int side = qMin( width, height );
glViewport( (width - side) / 2, (height - side) / 2, side, side );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );
//glFrustum( -0.05, +1.45, 0.0, 0.0, 0.0, 50.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
最后,渲染函数的一部分与视图相关:
gluLookAt(0.0, 0.0, 1.0, 0.0, -0.70, 0.0, 0.0, 1.0, 0.0 ); // This is the cut of part
//gluLookAt(0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); // Normal but weird rectangle
glScalef( 1.0, 1.0, 1.0);
答案 0 :(得分:1)
你的问题在于:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );
投影的左/右或上/下限应与视口的宽高相匹配。那些硬编码值将无法适应窗口几何体的变化。
还要确保近处和远处的平面不会切入可见的场景范围。