【问题标题】:rotating model while color updating颜色更新时旋转模型
【发布时间】:2011-10-23 04:01:33
【问题描述】:

在 OpenGL 中,我像结构(神经元)一样绘制树(由线条组成),并根据活动,在树的每个分支上应用颜色。每个分支部分在一个实例中可以具有不同的颜色。我在与分支对应的实例中记录颜色。

我能够旋转(通过更改模型视图矩阵)树。更新时,我可以看到树枝上不断变化的颜色(活动)。

但是,当颜色发生变化时,我无法旋转树。 (完全更新后会看到旋转)翻译模型也是如此,更新时无法翻译。

我应该怎么做才能同时看到它们?

我调用 updateViz 函数来更新颜色。

def render(self):
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    self.renderAxis()   #draws 3 axes at origin
    for obj in self.vizObjects:
        glPushMatrix()
        glColor(obj.r, obj.g, obj.b)
        glLineWidth(2)
        glBegin(GL_LINES)
        glVertex3f(obj.l_coords[0],obj.l_coords[1],obj.l_coords[2])
        glVertex3f(obj.l_coords[3],obj.l_coords[4],obj.l_coords[5])
        glEnd()     
        glPopMatrix()

def updateViz(self,vals):
    inds = digitize(vals,colrMapVals)
    for i in range(0,len(self.vizObjects)):
        self.vizObjects[i].r,self.vizObjects[i].g,self.vizObjects[i].b= colorMap[inds[i]-1]

def translate(self, _trans):
    self.makeCurrent()
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslated(_trans[0], _trans[1], _trans[2])
    glMultMatrixd(self.modelview_matrix_)
    self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)
    self.translate_vector_[0] = self.modelview_matrix_[3][0]
    self.translate_vector_[1] = self.modelview_matrix_[3][1]
    self.translate_vector_[2] = self.modelview_matrix_[3][2]

def rotate(self, _axis, _angle):
    #self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)
    t = [self.modelview_matrix_[0][0] * self.center_[0] +
         self.modelview_matrix_[1][0] * self.center_[1] +
         self.modelview_matrix_[2][0] * self.center_[2] +
         self.modelview_matrix_[3][0],
         self.modelview_matrix_[0][1] * self.center_[0] +
         self.modelview_matrix_[1][1] * self.center_[1] +
         self.modelview_matrix_[2][1] * self.center_[2] +
         self.modelview_matrix_[3][1],
         self.modelview_matrix_[0][2] * self.center_[0] +
         self.modelview_matrix_[1][2] * self.center_[1] +
         self.modelview_matrix_[2][2] * self.center_[2] +
         self.modelview_matrix_[3][2]]

    self.makeCurrent()
    glLoadIdentity()
    glTranslatef(t[0], t[1], t[2])
    glRotated(_angle, _axis[0], _axis[1], _axis[2])
    glTranslatef(-t[0], -t[1], -t[2])
    glMultMatrixd(self.modelview_matrix_)
    self.modelview_matrix_ = glGetDoublev(GL_MODELVIEW_MATRIX)

def keyPressEvent(self, ev):
    if (ev.key() == QtCore.Qt.Key_Left):
        self.translate([-0.25, 0.0, 0.0])
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_Right):
        self.translate([0.25, 0.0, 0.0])
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_A):
        self.rotate([1.0, 0.0, 0.0],2.0)
        self.updateGL()
    elif (ev.key() == QtCore.Qt.Key_Q):
        self.rotate([1.0, 0.0, 0.0],-2.0)
        self.updateGL()

我使用 PyQt4 和 PyGLWidget

【问题讨论】:

  • 轮换在哪里?上面的代码中除了模式设置和恒等之外没有任何矩阵运算。

标签: opengl visualization pyqt4 pyopengl


【解决方案1】:

您的代码在我看来没问题。我认为问题是由您如何更新旋转和颜色引起的。 OpenGL 是一个状态机,您向它提供各种信息(顶点位置、颜色等)并渲染事物,因此请确保在每一帧上都调用 updateVis 和 translate/rotate。

也许您的旋转/平移取决于 Qt 的信号/事件机制,并且不是每帧都调用它?

【讨论】:

  • 是的。我不会每帧都调用旋转和平移,正如您所说的那样,这是一个信号事件。否则我该如何旋转?谢谢。
  • 我使用的方式是创建一个定时器,让它连接定时器事件到渲染和更新函数。这是我使用 qt 在 c++ 中渲染 opengl 的代码,希望对您有所帮助:code.google.com/p/rayframe/source/browse/src/Launcher/…
  • 是的,我现在有一个单独的计时器来触发 updateViz 功能。它可以无缝运行!谢谢!
【解决方案2】:

OpenGL 不是一个场景图,您可以在其中更新旋转或平移。那些 glRotate、glTranslate 调用,它们是从事件处理程序中的绘图函数 NOT 调用的。更新事件处理程序中的一些变量,发出重绘,然后在绘图代码中根据变量中的值调用 glTranslate/glRotate。

【讨论】:

  • 我已按照您的建议更改了代码。我通过 Qt 更新变量,而不是旋转和平移功能。并在渲染函数调用中调用 gluLootAt(variables)。然而,这并没有改变我的结果。即使是现在,我也没有同时看到颜色变化的翻译。你能给我举个例子吗?
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-05-17
  • 2015-11-07
相关资源
最近更新 更多