1

OpenGL レンダリングを使用して Qt/GPU/OpenCL コードに取り組んでいます。3D シーンのアニメーションを実行し、アニメーション中にこの 3D シーンをマウスで回転させることに成功しました。しかし、アニメーションを一時停止すると、つまり 3D シーンが「固定」されていると、回転が機能しません。

マウスで回転するための 2 つの関数を次に示します。

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();
   }

}

この回転が固定シーンで機能しない理由を説明していただけますか?

4

1 に答える 1

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();
}
于 2012-11-30T16:43:59.813 に答える