私はゲーム開発者であり、数学を勉強していません。そのため、ツールとしてクォータニオンのみを使用します。また、3D回転を使用するには、クォータニオンを使用する必要があります(またはマトリックスですが、この質問ではクォータニオンに留まりましょう)。多くの開発者がそれらを使用することが重要だと思います。それが私の知識を共有し、できれば私が持っている穴を埋めたい理由です。今…
だから私が理解した限り:
クォータニオンは2つのことを説明できます。
- 3Dオブジェクトの現在の向き。
- オブジェクトが実行できる回転変換。(rotationChange)
クォータニオンでできること:
乗算:
四元数endOrientation =四元数rotationChange *四元数currentOrientation;
たとえば、3Dオブジェクトは左に90°回転します-そして、私の回転は、右に180°回転し、最後に3Dオブジェクトは90°回転します。
クォータニオンrotationChange =クォータニオンendRotation * Quaternion.Inverse(startRotation);
これにより、rotationChangeを取得し、これを別のOrientationに適用できます。
Vector3 endPostion = Quaternion rotationChange * Vector3 currentPosition;
たとえば、次のようになります。私の3Dオブジェクトは位置(0,0,0)にあり、乗算する回転は180度右への回転であり、終了位置は(0、-50,0)のようなものです。そのクォータニオンの中には、軸とその軸の周りの回転があります。ポイントをその軸のY度に向けます。
Vector3 rotateOffsetVector = Quaternion rotationChange * Vector3 currentOffsetVector;
例:開始方向はUP-(0,1,0)を示し、乗算した回転は右に180°回転し、終了方向は下を示しています。(0、-1,0)
ブレンド(LerpとSlerp):
クォータニオンcurrentOrientation = Quaternion.Slerp(startOrientation、endOrientation、interpolator)
補間器が1の場合:currentOrientation = endOrientation
補間器が0の場合:currentOrientation = startOrientation
Slerpはより正確に補間し、Lerpはより多くのパフォーマンスを補間します。
私の質問:
今まで説明したことはすべて正しいですか?
クォータニオンでできるのはそれだけですか?(obv。not)
他に何ができますか?
2つのクォータニオン間のDot製品とCross製品は何に適していますか?
編集:
いくつかの回答を含む質問を更新しました
n
さまざまな向き(姿勢、ポーズなど)があるとします。次に、重みを使用してそれらを平均化し、slerp / lerpを効果的に一般化できます。クォータニオンをローターに変換することもできます。これは、剛体に一定時間角速度を適用するのと同じです。したがって、四元数による角速度積分も記述できます。また、異なる2つの方向がどのように異なるかを推定することもできます(超球上の2つの四元数がまたがる弧の長さを計算します)。