2013-05-07 63 views
0

我想在QGLWidget中移动一个绘制机智OpenGL的立方体。下面是代码的一部分:如何使用Qt的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()时,它是否不应该将-0.1添加到z坐标,并因此在z方向上移动该立方体?根据我选择的值,立方体要么不移动(对于值大约为< -0.3),要么根本看不到它(值大约> 0.4)。首先,我认为它可能会移动得非常快并消失,或者移动速度非常慢,因此我看不到任何变化。但是玩z值总是会出现在上面提到的其中一种情况中......这不奇怪吗?我究竟做错了什么?

回答

0

问题解决了:这样做是正确的做法

void Hologram::paintGL() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    glTranslatef(0.0, 0.0, -dz); 

    drawBox(); 
} 

为什么我得到了上述奇怪的现象是由于该对象被透视的远/近平面裁剪的原因设置gluPerspective()...