2009-04-29 13 views
1

私のglutアプリケーションでは、私はカメラで飛行機をシミュレートしています。飛行機の速度が低いとき、私はカメラが落ちるときに鼻が地面に向かうようにするつもりです。私の最初の本能は、のピッチを-90degreesで下方に指すまで変更することでした。しかし、私はちょうどそのピッチを変えることはできません。なぜなら、飛行機がその側に傾いているか逆さまになっていると、地面に向かって方向が変わることに気づくでしょう。Glut glLoadMatrixfカメラ相当

今私は 'lookAt.y'を下にシフトすることでこれの大まかなシミュレーションをしようとしています。これを行うには、私はカメラを設定するために使用する現在のカメラの座標をすべて取得しようとしています (eye.x、eye.y、eye.z、look.x、look.y、look.z、up.x、 up.y、up.z)。次に、新しい変更値でセットを呼び出します。

カメラ機能を制御するためにCamera.cppとCamera.hを使用しています。すべての値を取得するためのメソッドを追加した後、here

を検索した後、実際にさまざまなカメラの動きが行われたときに目の値のみが実際に更新されます。私は私の質問は、これらの値を取得する方法ですね。

glLoadMaxtrixコールは、この機能

void Camera :: setModelViewMatrix(void) 

{ // load model view matrix with existing camera values 

    float m[16]; 

    Vector3 eVec(eye.x, eye.y, eye.z); 

    m[0] = u.x; m[4] = u.y; m[8] = u.z; m[12] = -eVec.dot(u); 

    m[1] = v.x; m[5] = v.y; m[9] = v.z; m[13] = -eVec.dot(v); 

    m[2] = n.x; m[6] = n.y; m[10] = n.z; m[14] = -eVec.dot(n); 

    m[3] = 0; m[7] = 0; m[11] = 0; m[15] = 1.0; 

look.x = u.y; look.y = v.y; look.z = n.y; 

    glMatrixMode(GL_MODELVIEW); 

    glLoadMatrixf(m); 

} 

「目」、「ルックアット」を取得する方法があり、ここで行列からの値「アップ」にありますか?あるいは、私はこれらの価値を得るために他の何かをするべきですか?事前に

-Thanksあなたの助けを

+0

ちょうど記録のために、飛行機の鼻は、速度が低いとき(指し示すのではなく)、はるかに上を向いています。飛行機は速度を制御するためにピッチを使用し、高度を制御するためにスロットルを使用します(それは直感に反します)。 –

答えて

1

あなたにリンクするカメラクラスは、実際のOpenGLのクラスではありませんが、で動作するように十分に単純でなければなりません。

引用された関数は、カメラオブジェクトの現在の値を取得し、OpenGLに送信します。カメラのセット機能を見ると、プログラムが実際にどのように値を計算しているかを見ることができます。

アイ値は直接保存されます。 lookAt値は、ベクトル演算によって(eye-n)の値に過ぎません。アップ値は最も難しいですが、ベクトル計算を正しく覚えていれば、up =(n cross u)と信じています。

+0

これは以前よりもずっと近くにあります。私は、現在のカメラの位置を取得し、カメラをそのまったく同じものに設定する関数を書いた。私が使用すると、正しいビューとそれのすぐ後ろにあるように見えるいくつかのビューの間でちらつくように見えます。 –

+0

Er、oops。 lookAt値を間違えました。 –

+0

すごくいいですが、今は逆さまです。正しい向きから180度回転します。 –