2011-07-16 8 views
0

私はpyOpenGLを試していますが、カメラを正しく動作させるのに問題がありました。OpenGLでカメラでフォワードを移動できません

def Draw(): 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 

    glRotatef(roty,1,0,0) 
    glRotatef(rotx,0,1,0) 
    glTranslate(0,0,eyez) 

    glPushMatrix() 

    glTranslate(0,0,-80) 

    glBegin(GL_QUADS) 
    glColor(0,1,0) 
    glVertex3f(-50,-5,10) 
    glVertex3f(-50,50,10) 
    glVertex3f(50,50,10) 
    glVertex3f(50,-5,10) 

    glColor(1,0,0) 
    glVertex3f(-50,-5,10) 
    glVertex3f(-50,50,10) 
    glVertex3f(-50,50,70) 
    glVertex3f(-50,-5,70) 
    glEnd() 

    glPopMatrix() 

    glutSwapBuffers() 

これらの回転は大きく機能しますが、カメラが向いている方向に進むことはできません。このように前進できるようにコードを修正すると、シーンは正しく回転しません。何が起きるかは、私が十分遠くまで戻ってくるとシーンが円で回転するということです。あなたは物事を設定することができます

答えて

5

あなたはむしろglRotateでオブジェクトを操作するよりもカメラの概念は移動(と私は考えすぎて回転)しているアプリケーションを作成する場合とglTranslategluLookAtに探して検討し、カメラ中心の方法で、話すことができます。

ちなみに、gluLookAtは、一部の人が「多く見逃している」と言っていますが、廃止予定です。この廃止されたユーティリティ機能から離れたい場合は、the source of this functionを参照し、CPU上で独自のマトリックスを動かしてください。

2

先に進むには、先にのどこにあるかを判断する必要があります。カメラが直面する方向を指す3Dベクトルを取得する必要があります。これを行う1つの方法は、ベクトル(0、0、-1)にカメラマトリックスの回転部分の逆数を掛けることです。一般的に、簡単な方法はありますが、カメラマトリックスをどのように計算するかによって異なります。

単位ベクトルがカメラの向きに向くと、簡単です。カメラの現在の位置に移動し、それをどの方向にどれだけ長く移動したいのかを乗算するだけです。

gluLookAtを使用する場合は、同時にルックアップポイントをオフセットする必要があることに注意してください。さもなければ、あなたのカメラは動くでしょうが、それは世界の空間の不動点に直面しようとします。

0

私はOpenGLが結合、他よりもJOGLでプログラムを最も使用していますが、私はあなたに、次のチェックポイントをお勧め:

*)を使用すると、正しい機能(私のためにそれはJOGL GLEventListenerのリシェイプです(int型で、設定されていますx、int y、int width、int height)メソッド)、ビューポートと錐台?

=>ビューポート(OpenGLの描画に使用するフレーム領域)について、あなたは通常、単にglViewportを呼び出す(x、y、幅、高さ)=>あなたのGLの図面

のためにすべてのあなたのキャンバスゾーンを割り当てます= >錐台(カメラ視野)の場合は、最初にProjection matrix(glMatrixMode(GL_PROJECTION))に切り替えて、錐台を設定してから、GL_MODELVIEW行列に戻って図面に備えておく必要があります。私は、錐台を定義するためにgluPerspective(45、(float)width/height、0.001f、1000f)を呼び出すことをお勧めします。画面の比率を与えるための幅/高さ、目(またはスクリーン)から0.001fの近位切頭面を与えるための0.001f、目から1000f離れた遠方の切頂面を与えるための1000f。

*)あなたの描画機能で、gluTechを示唆しているように、gluLookAtの呼び出しを使用することを考えましたか?私はあなたがgluLookAtを呼び出すことをお勧め、それは0,0,0ポイントが表示されますように(

0,0,1は、//カメラは、)(0,0,1に設定されている

0,0 、0、//カメラは(0,0,0)

0,1,0)//カメラはその上向きベクトル(0yは上向きベクトル)のために(0,1,0)を持っています。 ..論理)

希望は、これを助けることができます

関連する問題