質問

私のglutアプリケーションでは、カメラで飛行機をシミュレートしています。飛行機の速度が遅いときは、カメラが落ちると機首が地面に向くようにします。私の最初の本能は、ピッチを-90度で下向きになるまで変更することでした。ただし、飛行機を横向きまたは逆さまに傾けると、地面に向かって方向が変わることに気付くので、ピッチを変更することはできません。

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

Camera.cppとCamera.hを使ってカメラ機能を制御しています。 こちら

にあります。

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

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);

}

ここからマトリックスから「目」、「ルックアット」、「アップ」の値を取得する方法はありますか?または、これらの値を取得するために何か他のことをする必要がありますか?

-ご協力ありがとうございます

役に立ちましたか?

解決

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

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

アイ値は直接保存されます。 lookAt値は、ベクトル計算による(eye-n)の値です。アップ値は最も困難ですが、ベクトル計算を正しく覚えていれば、アップ=(nクロスu)と考えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top