3

OpenGL でシンプルなカメラ システムを実装しています。プロジェクション マトリックスの下に gluPerspective を設定し、ModelView マトリックスで gluLookAt を使用します。この後、キーボード イベントをチェックし、矢印キーのいずれかが押された場合は、角度速度と前方速度を変更するメイン レンダー ループを作成します (y 軸のみを回転し、z (前方) を移動します)。次に、次のコードを使用してビューを移動します (deltaTime は、動きをフレームレートから分離するために、最後のフレームがレンダリングされてからの時間 (秒単位) です)。

//place our camera  
newTime = RunTime(); //get the time since app start  
deltaTime = newTime - time; //get the time since the last frame was rendered  
time = newTime;  
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate  
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards  
//draw our vertices  
draw();  
//swap buffers  
Swap_Buffers();  

その後、コードは再びループします。私の描画アルゴリズムは で始まり、glPushMatrix()で終わりglPopMatrix()ます。

glRotatef() と glTranslatef() への各呼び出しは、ビューの方向に前方速度でビューを前方に押します。

ただし、コードを実行すると、オブジェクトは正しい場所に描画されますが、移動すると、ローカルの向きではなく、世界の原点 (0,0,0 - Z 軸に沿って面している) の向きで移動が行われます。 (私が指している場所)回転すると、回転はカメラの位置ではなく(0,0,0)について行われます。

その場で回転するのではなく、カメラが (0,0,0) を周回するという奇妙な効果が得られます。

glLoadIdentity()ループ内のどこにも電話をかけませんGL_MODELVIEW。また、ループ全体でマトリックス モードが に設定されていることは確かです。

もう 1 つの奇妙な効果はglLoadIdentity()、) 関数 (PushMatrix 呼び出しと PopMatrix 呼び出しの間) 内に呼び出しを配置するdraw(と、画面が真っ暗になり、どこを見ても描画するオブジェクトが見つからないことです。

その場で回転するのではなく、この軌道 (0,0,0) を作成するために私が何を台無しにしたか知っている人はいますか?

4

3 に答える 3

6

glRotate()ワールド原点を中心にModelViewマトリックスを回転させるため、任意の点を中心に回転するには、マトリックスを変換してその点を原点にし、回転させてから開始した場所に戻す必要があります。

必要なのはこれだと思います

float x, y, z;//point you want to rotate around

glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards

glTranslatef(x,y,z); //translate to origin
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(-x,-y,-z); //translate back
//draw our vertices
draw();
//swap buffers
Swap_Buffers();
于 2009-12-30T00:54:53.960 に答える
1

回転と翻訳の呼び出しを交換します:)

それらは行列スタックを事後乗算するため、最後に呼び出されるのは、そのようなことを気にする場合、概念的に適用される「最初」です。

于 2009-12-30T00:18:29.790 に答える
0

最初にカメラをポイント (0,0,0) に移動し、次に回転させてから元に戻す必要があると思います。

于 2009-12-30T00:35:55.493 に答える