2012-11-30 73 views
1

我正在使用OpenGL呈現Qt/GPU/OpenCL代碼。它執行3D場景的動畫,並且在動畫時,我可以用鼠標旋轉這個3D場景。但是當我暫停動畫時,即3D場景「固定」時,旋轉不起作用。Qt OpengL - 旋轉3D固定場景

這是一個有鼠標旋轉的兩個功能:

void GLWidget::mousePressEvent(QMouseEvent *event) 
{ 
    lastPos = event->pos(); 
} 

void GLWidget::mouseMoveEvent(QMouseEvent *event) 
{ 
    float dx = (event->y() - lastPos.y())/10.0f; 
    float dy = (event->x() - lastPos.x())/10.0f; 
    float dz = 0.0f; 
    float angle = sqrtf((event->x() - lastPos.x()) + (event->y() - lastPos.y())); 

    if (event->buttons() & Qt::LeftButton) { 
     angle = sqrtf(dx*dx + dy*dy); 
     glRotatef(0.1*angle, dx, dy, dz); 
     } 
} 

當動畫是「暫停」,我想能夠旋轉固定的場景,當我按下「重啓」按鈕,我希望動畫重新開始,並通過場景的旋轉完成上次修改的圖像。

因此,這應該是在做「暫停」之前,像上一個動畫的快照,然後旋轉的可能性,最後從上一個3D旋轉的場景重新開始動畫。

這是我的主顯示功能「processCurrent()」由QTimer何"draw()"包含了OpenGL函數,當我做了停頓animation設置爲false叫:

void GLWidget::processCurrent() 
{ 

if (Galaxy->isFirstLaunch) 
    { 
    draw(); 
    printStats(); 
    //Calling kernel for calculatig subsequent positions 
    Galaxy->runCLKernels(); 
    Galaxy->isFirstLaunch = false; 
    glFlush(); 
    swapBuffers(); 
    } 

if (animation) 
    { 
    clWaitForEvents(1, &Galaxy->glEvent); 
    draw(); 
    printStats(); 
    //Calling kernel for calculatig subsequent positions 
    Galaxy->runCLKernels(); 
    glFlush(); 
    swapBuffers(); 
    } 

} 

你能解釋我爲什麼這個旋轉沒有按」 t與固定的場景一起工作?

回答

0

你仍然需要繪製場景,如果draw()不僅繪製操作和沒有動畫操作和runCLKernels也動畫這應該工作:

if(animation) 
{ 
    //same as before... 
} 
else 
{ 
    // I don't know whether or not you would still call WaitForEvents... 
    draw(); 
    printStats(); 
    // Do NOT calculate subsequent positions, just use what was calculated last time. 
    glFlush(); 
    swapBuffers(); 
} 
+0

感謝,我忘了「畫」功能。 – youpilat13