c++ - OpenGL 窗口切断模型 View

标签 c++ qt opengl glulookat

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

我做了什么: 创建一个带有 Qt 小部件(按钮等)和 QGLWidget(我自己的实现)的 Qt 应用程序窗口。

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

Wrong aspect ratio 白色矩形是运动场(尺寸: float 坐标中的 1.4 x 2.7)

我可以转换模型,但它似乎被切断了: Model cut off

一旦我转换 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/

相关文章:

c++ - 通过平移放大鼠标位置?

c++ - 重载运算符中的段错误>>

c++ - 反转十六进制值的数字

c++ - 值在常量表达式 C++ 中不可用

c++ - Qt MySQL - 创建新表

使用 QList 时 Qt 崩溃(堆损坏)

opengl - 如何获取GPU多重采样模式描述?

c++ - QT 中的 QSlider 在新的 MacOS Monterey (v12.0.1) 中行为异常。任何解决方法?

qt - 每当 QWidget 添加到 QApplication 的小部件树时如何接收事件?

c++ - 片段着色器不会像 OpenGL GLSL 中的光那样创建渐变