WisdomSoft - for your serial experiences.

回転

オイラー角または四元数を用いてオブジェクトを任意の方向に回転させます。

オブジェクトの向きを変える

平面グラフィックスとは異なる立体グラフィックスの特徴は物体を回転させられることにあります。立体的なモデルを回転させる数学的な原理については割愛しますが、Unity ではオブジェクトの回転量を表す値に四元数を用いています。

四元数の各要素の値は、私たちが慣れ親しんでいる角度ではないため注意してください。Unity エディタ上での回転量はオイラー角が使われていますが、内部では四元数が用いられています。

オブジェクトの向きを変更するには Transform クラスの rotation プロパティを用います。このプロパティは、オブジェクトの回転量を四元数で設定または取得します。

Transform クラス rotation プロパティ
public Quaternion rotation { get; set; }

四元数で説明したように、必要であればオイラー角から Quaternion 構造体の値を生成できます。

position プロパティと localPosition プロパティの関係と同じように、オブジェクトの向きにもワールド座標とローカル座標の関係が存在します。上記の rotation プロパティによる向きの設定は、親オブジェクトの影響を受けないワールド座標系の向きとなります。これに対し、親オブジェクトの向きを継承するローカル座標系で設定したい場合は localRotation プロパティを利用してください。

Transform クラス localRotation プロパティ
public Quaternion localRotation { get; set; }

このプロパティは、親オブジェクトの向きを軸とする回転量を表します。

コード1
using UnityEngine;

public class Test : MonoBehaviour 
{
	void Start () 
	{
		transform.rotation = Quaternion.Euler(45, 45, 0);
	}
}
コード1 実行結果
コード1 実行結果

一方で、オイラー角でオブジェクトの回転量を表現する eulerAngles プロパティも存在します。オブジェクトの向きをオイラー角で設定したり、オブジェクトの回転量をオイラー角で取得したりしたい場合はこのプロパティを用いる、四元数との変換を省略できるため便利です。

Transform クラス eulerAngles プロパティ
public Vector3 eulerAngles { get; set; }

このプロパティは、Vector3 型でオイラー角による角度を表します。

同様に、ローカル座標系でのオイラー角による回転は localEulerAngles プロパティで表されます。

Transform クラス localEulerAngles プロパティ
public Vector3 localEulerAngles { get; set; }

ただし、これらオイラー角で表現されたプロパティは、内部で四元数との変換を行っているため不用意に使用しないよう注意してください。あくまで内部表現は Quaternion 型であるため、回転量の保存や計算は Quaternion 型で行うことが推奨されます。

コード2
using UnityEngine;

public class Test : MonoBehaviour 
{
	void Start () 
	{
		transform.eulerAngles = new Vector3(45, 45, 0);
	}
}
コード2 実行結果
コード2 実行結果

コード2の実行結果はコード1と同じです。このように、四元数からでもオイラー角からオブジェクトの向きを設定することができます。

オイラー角による回転

オブジェクトの現在の角度から指定した量だけを回転させるには Rotate() メソッドを使うと便利です。このメソッドは、オイラー角を用いて、オブジェクトの現在の向きに指定した角度を加えます。回転のアニメーションなどをスクリプトから行う場合に便利です。

Transform クラス Rotate() メソッド
public void Rotate(float xAngle, float yAngle, float zAngle)
public void Rotate(Vector3 eulerAngles)

X 軸の回転量は xAngle パラメータに、Y 軸の回転量は yAngle パラメータに、Z 軸の回転量は zAngle パラメータに、それぞれ指定します。

eulerAngles パラメータには、各軸の回転量を格納した Vector3 型のベクトルを指定します。

やはり Rotate() メソッドも内部でオイラー角から四元数への変換が行われています。

コード3
using UnityEngine;

public class Test : MonoBehaviour 
{
	void Start () 
	{
		transform.Rotate(10, 0, 0);
		transform.Rotate(0, 20, 0);
		transform.Rotate(0, 0, 30);
	}
}
コード3 実行結果
コード3 実行結果

コード3は X 軸、Y 軸、Z 軸ごとに Rotate() メソッドで回転させています。実行結果を見れば Rotate() メソッドが現在のオブジェクトの向きに対して、指定した回転量を加えていることが確認できます。