2011-08-09 17 views
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

+0

回転はどこですか?上記のコードには、モード設定とID以外の行列操作はありません。 –

+0

はコード – chaitu

答えて

1

を使用しています。私は問題は、回転と色を更新する方法によって引き起こされると思います。 OpenGLはステートマシンで、あらゆる種類の情報(頂点の位置、色など)でフィードして、レンダリングされるので、updateVisとtranslate/rotateがすべてのフレームで呼び出されることを確認してください。

Qtのシグナル/イベントメカニズムに依存し、フレームごとに呼び出されない場合がありますか?

+0

を追加しました。私はフレームごとに回転と平行移動を呼び出すのではなく、あなたが置いた信号イベントです。そうでなければどうやって回転させるのですか?ありがとう。 – chaitu

+0

私が使用する方法は、タイマーを作成し、タイマーイベントをレンダリングおよび更新機能に接続させることです。ここで私のコードはQtを使用してOpenGLをC++でレンダリングしています。それが助けてくれることを願っています:http://code.google.com/p/rayframe/source/browse/src/Launcher/MyGLWidget.cpp – Raymond

+0

はい、私は今ではupdateViz関数をトリガーします。そしてそれはシームレスに動作します!ありがとうございました! – chaitu

0

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

+0

提案したコードを変更しました。 rotate関数とtranslate関数の代わりに、私はQt経由で変数を更新します。また、render func呼び出しでgluLootAt(変数)を呼び出します。しかしこれは私の結果を変えるものではありません。今でも色の変化と同時に翻訳が表示されません。どのような例を教えてもらえますか? – chaitu

関連する問題