2013-05-07 38 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()...

相關問題