既存のクォータニオンにオイラー角を追加したい。これが私が得たものです:
Quaternion oldTransform = transform.Rotation;
float YawRotation = mouseDiff.x * RotationSpeed;
Quaternion YawRotationQuaternion = new Quaternion();
YawRotationQuaternion.CreateFromAxisAngle (0, 1, 0, YawRotation);
float PitchRotation = mouseDiff.y * RotationSpeed;
Quaternion PitchRotationQuaternion = new Quaternion();
PitchRotationQuaternion.CreateFromAxisAngle ( 1, 0, 0, PitchRotation);
Quaternion result = oldTransform * YawRotationQuaternion * PitchRotationQuaternion;
transform.Rotation = result;
ヨーとピッチの回転のみが必要です。古い変換にはこのプロパティがあります。それに追加するオイラー角も、ピッチとヨーの回転のみです。それを乗算するとどうなるかというと、oldTransform が記述する回転がロール回転を導入するということです。
それから私は試しました:
Quaternion result = YawRotationQuaternion * oldTransform * PitchRotationQuaternion;
これにより、ロールの回転は発生しません。このオプションは、oldTransform がヨー軸をピッチ軸に回転させるときにジンバル ロックがあるため、さらに悪化します。
ここで想像できるのは、oldTransform から古いヨーとピッチの回転を取得し、ヨーとピッチの軸を変更して、それらが (0,1,0) と (1,0,0) ではなくなるようにすることです。ここでの問題は、クォータニオンからオイラー角を抽出すると、ジンバル ロックも得られることです。
では、特定の軸のオイラー角をクォータニオンに追加するにはどうすればよいでしょうか?