我正在使用 Qt 和 OpenGL(更具体地说,QGLWidget)用 C++ 编写台球游戏。我对 OpenGL 有所了解,但不是太专业。
我做了什么: 创建一个带有 Qt 小部件(按钮等)和 QGLWidget(我自己的实现)的 Qt 应用程序窗口。
问题: 我可以在这个窗口中画一个球并旋转它,...等等但是 View 的纵横比不正确+我似乎无法使用整个空间。
白色矩形是运动场(尺寸: float 坐标中的 1.4 x 2.7)
我可以转换模型,但它似乎被切断了:
一旦我转换 View (检查下面的功能),我的模型的一部分似乎被切断了。
这是矩形(球在这些坐标内正确绘制):
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();
}
最后,与 View 相关的渲染函数的一部分:
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);
最佳答案
你的问题出在这里:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -0.05, +1.45, -0.05, +2.75, 0.0, 50.0 );
投影的左/右或上/下限制应与视口(viewport)的方位相匹配。这些硬编码值不会适应窗口几何形状的变化。
还要确保近平面和远平面不会切入可见场景范围。
关于c++ - OpenGL 窗口切断模型 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881121/