回答:
クォータニオンをヨー/ピッチ/ロールの角度セットに分解することもできますが、通常はやり過ぎです。
このようにクォータニオンを作成する代わりに:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
これを試して:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
その後、チルト/ロールは生成されず、ヨーとピッチを別々に保存するのと同等です
framePitch
とframeYaw
float
種類?また、私はあなたの最初の文のいくつかの明確化に感謝します。
cameraOrientation
、framePitch
およびframeYaw
すべての四元数(クォータニオン各4つの浮動小数点数または倍精度である)です。
これは私がしばらくの間抱えていた問題であり、答えを見つけることができなかったので、ここに投稿すると思いました。
実際には非常に簡単です。回転を行う可能性が最も高い方法は次のとおりです。
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次が必要です。