3

昨日私は尋ねました:ピッチとヨーを呼び出すだけでカメラが回転するのはどうしてですか?

基本的に、「ジンバルロック」のおかげで、ピッチ+ヨーをすると必然的にローリング効果が発生することがわかりました。詳細については、その質問を読むことができます。

私はこれが起こらないようにしようとしています。通常のFPSシューティングゲームで見回すと、カメラがいたるところに転がることはありません。

これが私の現在のパッシブマウス機能です:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

これにより、(カーソルを中央に置いたまま)マウスの動きに基づいてカメラがピッチ/ヨーします。オリジナルのカメラクラスもここに投稿しました。

そのスレッドの誰かが、この影響が発生しないようにクォータニオンを使用することを提案しましたが、ウィキペディアのページを読んだ後は、単にそれらを理解していません。

OpenGL / Glutアプリでクォータニオンを作成して、不要なロールなしで「カメラ」を適切に見回せるようにするにはどうすればよいですか?

4

4 に答える 4

2

gluLookAtで使用するように設計されたシンプルなクォータニオンベースのカメラ。

http://www.gamedev.net/reference/articles/article1997.asp

于 2009-04-25T04:35:50.187 に答える
1

それを避けるために、デルタの変化を低く保ちます(つまり、45度未満)

各フレームの回転で小さな「デルタ」行列を計算し、これを各フレームのカメラ行列に折り畳むだけです。(つまり、カム = カム * デルタ)

長時間実行すると、数値エラーが発生する可能性があるため、再度直交化する必要があります。(そのようなことがあれば調べてください)

これは、いろいろと遊んでいるときにジンバル ロックを回避する最も簡単な方法です。慣れてくると、あとは理解できるようになります。

四元数については、それらを回転行列に変換できる適切なライブラリを見つけてから、同じ手法を使用してください(デルタクォートを計算し、メインクォートに乗算します)。

于 2009-05-20T20:41:23.323 に答える
0

すべてを極座標で表します。ウィキペディアのページから始める必要があります。

于 2009-04-25T04:45:07.437 に答える
0

その単純なケースではクォータニオンは実際には必要ありません。必要なのは、ヘディングとピッチを 3 次元行列計算に入力することです。

  1. MY を計算するには、Y 軸を回転させたヘディング値を使用します

  2. MX を計算するには、X 軸の回転でピッチ値を使用します

  3. 各ポイント P について、R = MX * MY * P を計算します。

計算は次の 2 つの方法で行うことができます。

  1. T = MY * P の場合、R = MX * T

  2. T = MX * MY の場合、R = T * P

最初の方法は遅くなりますが、最初は簡単にコーディングできます。2 番目の方法は高速ですが、行列 - 行列乗算関数をコーディングする必要があります。

ps。行列についてはhttp://en.wikipedia.org/wiki/Rotation_matrix#Dimension_threeを参照してください

于 2009-04-25T06:03:12.850 に答える