0

我正在使用 Qt 和 OpenGL(更具体地说,QGLWidget)用 C++ 编写台球游戏。我对 OpenGL 有一定了解,但不是太专业。

我所做的:创建一个 Qt 应用程序窗口,其中包含 Qt 小部件(按钮,...)和一个 QGLWidget(我自己的实现)。

问题:我可以在这个窗口中画一个球并旋转它,等等,但是视图的纵横比不正确+我似乎无法使用整个空间。

错误的纵横比 白色矩形是比赛场地(尺寸: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);
4

1 回答 1

1

你的问题出在这里:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );

投影的左/右或上/下限制应与视口的方面相匹配。这些硬编码值不会适应窗口几何形状的变化。

还要确保近平面和远平面不切入可见场景范围。

于 2012-06-04T12:31:31.173 回答