2012-11-30 76 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