Unity は左手座標系を使用します。Unity では、回転や向きを表現するのに、オイラー角とクォータニオンの両方を使用することができます。これらの表現は同等ですが、異なる用途と制限があります。
通常、シーンのオブジェクトを回転させるには、オイラー角で方向を表示する Transform コンポーネントを使用します。ただし、Unity は回転と向きを内部的にクォータニオンとして保存します。これは、ジンバルロックにつながるかもしれないより複雑な動きに役立ちます。
座標系とは、3 次元空間におけるオブジェクトの位置を表すものです。Unity は左手座標系を使用しています:正の X 軸は右を指し、正の Y 軸は上を指し、正の Z 軸は前方を指します。Unity の左手座標系は、正の Z 軸に沿って見たとき、正の X 軸から正の Y 軸への回転方向が反時計回りであることを意味します。
Transform 座標では、Unity は回転をベクトルプロパティ Transform.eulerAngles
X、Y、Z で表示します。通常のベクトルとは異なり、これらの値は実際に X、Y、Z 軸に関する回転角度 (度単位) を表します。
オイラー角の回転は、3 つの軸の周りに 3 つの別々の回転を実行します。Unity では、Z 軸、X 軸、Y 軸の順にオイラー角回転を行います。この回転方法は外的 (extrinsic) 回転で、回転が行われても元の座標系は変化しません。
ゲームオブジェクトを回転させるには、Transform コンポーネントに各軸をどれだけ回転させたいかという角度の値を入力します。スクリプトでゲームオブジェクトを回転させるには、Transform.eulerAngles
を使います。オイラー角に変換して計算や回転を行うと、ジンバルロックの問題が発生する場合があります。
3D 空間にある物体が自由度を失い、2 次元内でしか回転できなくなることをジンバルロックといいます。ジンバルロックは、オイラー角で 2 つの軸が平行になると発生することがあります。 スクリプトで回転値をオイラー角に変換しない場合は、クォータニオンを使ってジンバルロックを防ぐことができます。
ジンバルロックの問題がある場合、回転に Transform.RotateAround
を使用すれば、オイラー角を回避することができます。また、各軸に Quaternion.AngleAxis
を使用し、それらを掛け合わせることもできます (クォータニオンの乗算は、各回転を順番に適用します)。
クォータニオンは、3D 空間における空間の向きや回転を表すための数学的表記法です。クォータニオンは 4 つの数値を使って、3D の単位軸の周りの回転方向と角度をエンコードします。これらの 4 つの値は方向や度数ではなく、複素数です。詳しくは、mathematics of quaternions を参照してください。
Unity では回転値をクォータニオンに変換して保存します。クォータニオンの回転は計算が効率的で安定しているからです。1 つのクォータニオンはどの軸に関しても 360 度以上の回転を表すことができないため、Unity エディターは回転をクォータニオンで表示しません。
Quaternion クラス を使用すると、クォータニオンを直接使用することができます。回転にスクリプトを使用する場合は、Quaternion クラスと関数を使用して回転値をもとめたり変更することができます。オイラー角で値を回転に適用することもできますが、問題を避けるためにクォータニオンとして保存する必要があります。
回転を好みの方法で表示編集するために、クォータニオンとオイラー角の間で変換するには、スクリプトを使用します。
Quaternion.Euler
関数を使用します。Quaternion.eulerAngles
関数を使用します。