クォータニオンを使用するFPSカメラが傾いたり台無しにならないようにするにはどうすればよいですか?


17

FPSのようなカメラを使用していますが、クォータニオンを使用しています。しかし、私が見上げて横向きにしようとするたびに、それは傾き、時には逆さまになることがあります。どうすれば修正できますか?


3
(7時間以内に自己回答します)...
Aeodyn

回答:


16

クォータニオンをヨー/ピッチ/ロールの角度セットに分解することもできますが、通常はやり過ぎです。

このようにクォータニオンを作成する代わりに:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

これを試して:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

その後、チルト/ロールは生成されず、ヨーとピッチを別々に保存するのと同等です


3
この。これはまさに私が探していたものです。ワンライナーで私の問題を解決しました。いいね!
-aardvarkk

1
あるframePitchframeYaw float種類?また、私はあなたの最初の文のいくつかの明確化に感謝します。
シルダンク

1
@sirdank cameraOrientationframePitchおよびframeYawすべての四元数(クォータニオン各4つの浮動小数点数または倍精度である)です。
ダン

8

これは私がしばらくの間抱えていた問題であり、答えを見つけることができなかったので、ここに投稿すると思いました。

実際には非常に簡単です。回転を行う可能性が最も高い方法は次のとおりです。

currentDirection * newRotation;

ただし、このように実行しても機能しません。

newRotation * currentDirection;

あなたがしなければならないことは、上下の回転については最初の順序で、そして横向きの回転については二番目の順序でそれをすることです。

私にとっては、このようなものでした:

        if (keyboard.IsKeyDown(Keys.Up))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Down))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Left))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
        if (keyboard.IsKeyDown(Keys.Right))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;

理由は、最初の方法では現在の横方向に相対的な回転があり、これは上下に必要ですが、横方向の回転には必要ないため、2次が必要です。


私は自分自身に答えるのに7時間待たなければなりません
でした...-Aeodyn

申し訳ありませんが、これをスクリーンショットで説明できますか?「一次」と「二次」は少しわかりにくいです-ありがとう!
Atav32

クォータニオンを使用する場合、3D回転で常にそうであるように、順序は重要です。私の例では、「Direction * = newRotation」は「Direction = Direction * newRotation」と同じです。しかし、左と右の回転では、逆にしたいのです。これにより、上下の傾きに依存せず、ロールが発生します。
-Aeodyn

ああ、私はクォータニオンのポイントはジンバルロックを回避し、回転はすべて独立しているということでしたが、教科書を読み間違えたかもしれません。明確にするために、回転変換の順序を逆にすれば、カメラの傾きを防ぐことができると言っているのですか?または、ヨーを回転させるときにロールとピッチの変換を手動で0に設定していますか?
Atav32

5

FPSカメラの場合、通常はロールが不要で、ピッチは+/- 90度に制限されているため、ヨー角とピッチ角を使用して現在の状態を追跡します。四元数の完全な力は、これにはあまり役に立ちません。

クォータニオンキーフレーム補間などを使用してFPSカメラとアニメーションカメラを切り替えたい場合は、ヨー/ピッチ角をクォータニオンとの間で変換できます。


0

もう1つの簡単なトリックは、カメラをGameObjectに配置し、Yaw回転でゲームオブジェクトを制御し、子カメラはPitch座標で構成することです。

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.