c++ - Qt OpengL - 旋转 3D 固定场景

标签 c++ qt opengl

我正在使用 OpenGL 渲染编写 Qt/GPU/OpenCL 代码。它执行 3D 场景的动画,我在动画时成功地用鼠标旋转了这个 3D 场景。但是当我暂停动画时,即当 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 函数和动画当我暂停时设置为 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();
   }

}

你能解释一下为什么这种旋转不适用于固定场景吗?

最佳答案

你仍然需要绘制场景,如果 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();
}

关于c++ - Qt OpengL - 旋转 3D 固定场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649122/

相关文章:

c# - 实现类似 [DllImport] 的机制

java - 如何在执行jar文件时打开cmd(qt QProcess)

c++ - 为什么从函数调用时 c++11 std::normal_distribution 返回相同的模式?

c++ - 当 QAction 位于前导位置时如何获取 QLineEdit 文本偏移量

c++ - 为什么我不能直接在临时对象上调用 operator() ?

c++ - Qt:在另一个 QGraphicsItem C++ 中限制 QGraphicsItem 的可移动区域

python - 通过鼠标事件 PyQt 在 PyQt 窗口中创建一行

c++ - 是否可以在 opengl 中使用深度缓冲区渲染 3D 纹理

opengl - GLSL 顶点着色器中的眼睛空间像素宽度

java - Eclipse 中的 JOGL OpenGL 抛出 NoSuchMethodError