如何使用Qt的QGLWidget准确更新OpenGL中的对象位置?

How do I exactly update an objects position in OpenGL using Qt's QGLWidget?

本文关键字:OpenGL 对象 更新 位置 何使用 Qt QGLWidget      更新时间:2023-10-16

我试图在QGLWidget中移动一个用OpenGL绘制的立方体。下面是部分代码:

void Hologram::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawBox();
}
void Hologram::drawBox() {
    for (int i = 0; i < 6; i++) {
        glBegin(GL_QUADS);
        glNormal3fv(&n[i][0]);
        glVertex3fv(&v[faces[i][0]][0]);
        glVertex3fv(&v[faces[i][1]][0]);
        glVertex3fv(&v[faces[i][2]][0]);
        glVertex3fv(&v[faces[i][3]][0]);
        glEnd();
    }
    qDebug() << "drawing box";
}
void Hologram::initializeGL() {    
    /* Enable a single OpenGL light. */
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    /* Use depth buffering for hidden surface elimination. */
    glEnable(GL_DEPTH_TEST);
    /* Setup the view of the cube. */
    glMatrixMode(GL_PROJECTION);
    gluPerspective( /* field of view in degree */ 40.0,
                    /* aspect ratio */ 1.0,
                    /* Z near */ 1.0, /* Z far */ 10.0);
    glMatrixMode(GL_MODELVIEW);
//    qDebug() << "vx:" << vx << "vy:" << vy << "vz:" << vz;
    gluLookAt(0.0, 0.0, 5.0,  // eye position
              0.0, 0.0, 0.0,      // center
              0.0, 1.0, 0.);      // up vector
    // Adjust cube position
    glTranslatef(0.0, 0.0, -1.0);
}
void Hologram::animate() {
    glTranslatef(0.0, 0.0, -0.1);
    updateGL();
}

我已经实现了一个计时器,通过信号插槽连接定期调用animate()。每次执行animate()时,它不应该为z坐标添加-0.1,从而在z方向上移动立方体吗?根据我选择的值,立方体要么不移动(对于值约为。<-0.3)或者我根本看不到它(值大约。> 0.4)。一开始我认为它要么移动得很快然后消失,要么移动得很慢,所以我看不到任何变化。但是摆弄z值总是以上述的一种情况告终……这不是很奇怪吗?我做错了什么?

问题解决了:正确的方法是

void Hologram::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -dz);
    drawBox();
}

我得到上面描述的奇怪行为的原因是由于对象被使用gluPerspective()设置的透视图的近/远平面剪切…