0

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を使用しています

4

2 に答える 2

1

あなたのコードは私には大丈夫です。回転と色の更新方法が問題の原因だと思います。OpenGL はステート マシンです。あらゆる種類の情報 (頂点の位置、色など) を入力するとレンダリングされます。そのため、必ず updateVis と translate/rotate がすべてのフレームで呼び出されるようにしてください。

回転/移動は Qt のシグナル/イベント メカニズムに依存している可能性があり、すべてのフレームで呼び出されるわけではありませんか?

于 2011-08-10T05:25:03.427 に答える
0

OpenGL は、回転や平行移動を更新するシーン グラフではありません。これらの glRotate、glTranslate 呼び出しは、イベント ハンドラーではなく、描画関数から呼び出されることを意図しています。イベント ハンドラーでいくつかの変数を更新し、再描画を発行してから、変数の値に従って描画コードで glTranslate/glRotate を呼び出します。

于 2011-08-10T09:50:59.077 に答える