0

带有玛雅的openGL

我用 QGLWidget 制作了一个 openGL 视图。使用 Maya 时出现问题。正如您在视频中看到的,当我在 Maya 中单击并移动模型面板时,QGLWidget 会损坏。我发现选框矩形显示在我的 QGLWidget 上,而不是 Maya 上。为什么会出现这个问题?

到约会狼

我尝试按照您的建议编辑我的代码。但是......它根本不调用 makeCurrent() 和 doneCurrent() 。我希望当我单击我的 Maya 模型面板时,它可以向我发送消息,但它没有。我错过了什么?对此感到抱歉。

def makeCurrent(self):
    import OpenGL.WGL as wgl
    print "MAKE CURRENT!!!"
    self.prevHDC = wgl.wglGetCurrentDC()
    self.prevHRC = wgl.wglGetCurretnContext()
    super(GLWidget, self).makeCurrent()
        
def doneCurrent(self):
    import OpenGL.WGL as wgl
    print "DONE CURRENT!!!"
    super(GLWidget, self).doneCurrent()
    wgl.wglMakeCurrent(self.prevHDC, self.prevHRC)

我写的和上面一样。但它甚至从不显示“MESSAGE”。

4

1 回答 1

0

Qt 和 Maya 的事件循环很可能正在争夺处理事件。Qt 的paintGL 做正确的事,并在调用它时使OpenGL 上下文处于当前状态。但是 Maya 不会,因此 Maya 的绘图命令最终会出现在您的 OpenGL 上下文中。

与 Maya 一起玩会很棘手,因为它需要先存储哪个 OpenGL/DC 上下文是活动的,然后再切换和恢复它,一旦完成了自己的操作。您可能必须继承 QGLWidget 和 QGLContext 才能做到这一点。

因评论而更新

从 QGLWidget 派生,添加两个成员HDC m_prevHDCand HRC m_prevHRC,覆盖 makeCurrent 和 doneCurrent

void QMyGLWidget::makeCurrent()
{
    this->m_prevHDC = wglGetCurrentDC();
    this->m_prevHRC = wglGetCurrentContext();

    QGLWidget::makeCurrent();
}

void QMyGLWidget::doneCurrent()
{
     QGLWidget::doneCurrent();

     wglMakeCurrent(this->m_prevHDC, this->m_prevHRC);
}

然后从这个中间类派生你的实际 GLWidget。

于 2012-11-09T10:55:08.057 回答