UnityのQuaternion【使い方とスクリプト】

この記事はUnityのクラスであるQuaternionの使い方についてまとめた記事です。

<Quaternionとは>

Quaternionはある回転軸を元に物体を回転させる時に使用する4次元ベクトルの事です。

x,y,z,wで表されます。

詳しくは↓の記事で解説していますのでよかったらみてください。

<Quaternionのスクリプトの使い方>

名前空間UnityEngine
struct
クリックすると展開します

identity

回転していない状態のクォータニオンです。

読み取り専用です。(x,y,z,w)の値は(0,0,0,1)になります。

型 Quaternion型

○ 使い方
主にクォータニオンの初期化などに使用されます。

Quaternion q =  Quaternion.identity;

eulerAngles

クォータニオンをオイラー角に変換した値です。

型 Vector3型

○ 使い方
オイラー角を使用することができるので直感的にクォータニオンを扱えて便利です。

transform.rotation.eulerAngles = new Vector3(1.1f,1.1f,1.1f);

normalized

クォータニオンを正規化して返します。

読み取り専用です。

型 Quaternion型

○ 使い方
クォータニオンの大きさを1として扱いたい時などに使用します。

Quaternion q =  transform.rotation.normalized;

配列[]

クォータニオンの各要素を格納する配列です。

[0]=x,[1]=y,[2]=z,[3]=wです。読み取り専用です。

型 float型

○ 使い方
この値を直接触るということはあまり無いかと思います。クォータニオンは全く直感的ではない為、この値をいじることでどうなるのか理解している人が使用するものだと思います。

for(int i = 0; i < 4; ++i)
{
Debug.Log(transform.rotation[i]);
}

w,x,y,z

クォータニオンの各種要素です。

各種値が何かというのは概要欄からどうぞ。読み取り専用です。

型 float型

○ 使い方
この値を直接触るということはあまり無いかと思います。クォータニオンは全く直感的ではない為、この値をいじることでどうなるのか理解している人が使用するものだと思います。

Debug.Log(transform.rotation.x);

Set

クォータニオンの値を設定します。

1. x : float型
2. y : float型
3. z : float型
4. w : float型

返り値(戻り値)

なし

○ 使い方
クォータニオンの値を変えたい場合に使用します。新しくnewするより軽いので、積極的に使いたいところなのですが、transform.rotation.Set()としても姿勢は回転しないので使いどころが難しいです。

Quaternion q = new Quaternion(); 
q.Set(1.1f,1.1f,1.1f,1.1f);
transform.rotation = q;

↑transform.rotationの関数を直接呼び出しても回転しません。

SetFromToRotation

基準にしたベクトルから目標のベクトルへ向かう回転を表すクォータニオンになります。

1. 基準となるベクトル : Vector3型
2. 目標となるベクトル : Vector3型

返り値(戻り値)

なし

○ 使い方
基準にしたベクトルから目標のベクトルへ向かう回転を得たい場合に使用します。

Quaternion q = new Quaternion();
q.SetFromToRotation(transrom.position,目標のゲームオブジェクト.transform.position);
transform.rotation = q;

↑transform.rotationの関数を直接呼び出しても回転しないようです。

SetLookRotation

前方向と上方向のベクトルを指定して、その方向の回転を表すクォータニオンになります。

1. 前方向のベクトル : Vector3型
2. 上方向のベクトル : Vector3型 (デフォルト引数 Vector3.up)

返り値(戻り値)

なし

○ 使い方
ベクトルから姿勢を得たい場合に便利な関数です。

Quaternion q = new Quaternion();
q.SetLookRotation(transrom.position,目標の位置(Vector3));
transform.rotation = q;

↑transform.rotationの関数を直接呼び出しても回転しないようです。

ToAngleAxis

このクォータニオンの角度と回転軸を返します。

1. 角度 : float型 (参照渡し)
2. 回転軸の単位ベクトル : Vector3型(参照渡し)

参照渡しな為、返り値はありません。参照渡しした変数の中に値が入ります。

返り値(戻り値)

なし

○ 使い方
クォータニオンの角度と回転軸を計算に使用する時に便利です。

使い方
float kakudo = 0f;
Vector3 ziku = new Vector3();
transform.rotation.ToAngleAxis(out kakudo, out ziku);
Debug.Log("角度は" + kakudo + " 回転軸のベクトルは " + ziku);

ToString

(x,y,z,w)が文字列で返ってきます。()もついてきます。

なし

返り値(戻り値)

string型に直したQuaternion : string型

○ 使い方
主にデバッグ用に使用します。

Debug.Log(transform.rotation.ToString());

Angle

2 つの回転間の角度を返します。

回転間の角度というとイメージしづらいですが、単に姿勢の角度差だと思ってもらえばいいかなと思います。片方の姿勢からもう片方の姿勢へと回転させる際の回転角度の絶対値を表します。

1. 基準となる回転 : Quaternion型
2. 目標とする回転 : Quaternion型

返り値(戻り値)

2 つの回転間の角度 : float型

○ 使い方
2つの回転の角度差を知りたい時に使用します。

float f = Quaternion.Angle(transform.rotation, 目標のゲームオブジェクト.transform.rotation);

AngleAxis

回転軸周りの回転を作成します。

1. 回転角度 : float型
2. 回転軸の向き : Vector3型

返り値(戻り値)

回転軸周りの回転 : Quaternion型

○ 使い方
回転軸と角度から直感的にクォータニオンを生成できる便利な関数です。

Quaternion q = Quaternion.AngleAxis(1.1f, new Vector3(1.1f,1.1f,1.1f);

Dot

2 つの回転の内積を返します。

クォータニオンの内積はふたつの回転が成す角度cos⁡θとなります。そのため、クォータニオンの内積が
0以上なら角度は-90〜90で
0以下なら-180〜-90か90〜180です。

1. 回転1 : Quaternion型
2. 回転2 : Quaternion型

返り値(戻り値)

2 つの回転の内積 : float型

○ 使い方
内積の値からお互いの向きを計算するのに便利です。

float f = Quaternion.Dot(transform.rotation, 目標のゲームオブジェクト.transform.rotation);

Euler

オイラー角をクォータニオンに変換して返します。

1. オイラー角のx成分 : float型
2. オイラー角のy成分 : float型
3. オイラー角のz成分 : float型

1. オイラー角 : Vector3型

返り値(戻り値)

オイラー角をクォータニオンに直したもの : Quaternion型

○ 使い方
オイラー角からクォータニオンを生成できるので、直感的に回転を作れます。割とよく使う関数だと思います。

Quaternion q = Quaternion.Euler(new Vector3(1.1f,1.1f,1.1f));

FromToRotation

ある方向からある方向への回転を返します。

1. 基準となる方向 : Vector3型
2. 向かう方向 : Vector3型

返り値(戻り値)

ある方向からある方向への回転 : Quaternion型

○ 使い方
直感的に回転を作れるのでとても便利です。

Quaternion q = Quaternion.FromToRotation(transform.position,目標のゲームオブジェクト.transform.position);

Inverse

逆クォータニオンを返します。

1. 元となる回転 : Quaternion型

返り値(戻り値)

逆クォータニオン : Quaternion型

○ 使い方
逆クォータニオンを得たい場合に便利です。行列計算を行う際などに使用します。

Quaternion q = Quaternion.Inverse(transform.rotation));

Lerp

2つの回転を0〜1の間で補間し、正規化します。

これは線形補間です。Quaternionはその性質上球面線形補間を使用するのが普通です。

1. 基準となる回転 : Quaternion型
2. 目標の回転 : Quaternion型
3. 0〜1の補間係数 : float型

返り値(戻り値)

線形補間された回転 : Quaternion型

○ 使い方
これを使用する理由は計算を簡易化して処理を早くする為です。計算を簡略化している為、精度が悪く、2つの回転間の角度が大きいほど粗が目立ちます。通常はLerpではなくSlerpを使用します。

Quaternion q = Quaternion.Lerp(transform.rotation,目標のゲームオブジェクト.transform.rotation,0.1f);

LerpUnclamped

2つの回転を補間し、正規化します。

この時、補間は1以上を指定することができます。1以上を指定すると目標の回転を通り過ぎます。例えば2を入れると基準から目標への回転の2倍回転します。

これは線形補間です。Quaternionはその性質上球面線形補間を使用するのが普通です。

1. 基準となる回転 : Quaternion型
2. 目標の回転 : Quaternion型
3. 補間係数 : float型

返り値(戻り値)

線形補間された回転 : Quaternion型

○ 使い方
これを使用する理由は計算を簡易化して処理を早くする為です。計算を簡略化している為、精度が悪く、2つの回転間の角度が大きいほど粗が目立ちます。通常はLerpではなくSlerpを使用します。

Quaternion q = Quaternion.LerpUnclamped(transform.rotation,目標のゲームオブジェクト.transform.rotation,1.1f);

LookRotation

指定した向きを向く回転を返します。

1. 向く向きの前方向 : Vector3型
2. 向く向きの上方向 : Vector3型 (デフォルト引数 Vector3.up)

返り値(戻り値)

指定した向きを向く回転 : Quaternion型

○ 使い方
クォータニオンを直感的に得ることができるので便利です。

Quaternion q = Quaternion.LookRotation(Vector3.forward,Vector3.up);

Normalize

クォータニオンを正規化します。

1. 正規化したい : Quaternion型

返り値(戻り値)

正規化したクォータニオン : Quaternion型

○ 使い方
クォータニオンを正規化したい場合に使用します。

Quaternion q = Quaternion.Normalize(transform.rotation);

RotateTowards

ある回転からある回転への回転を返します。

1度に回転する最大値を設定することができます。

1. 基準となる回転 : Quaternion型
2. 目標の回転 : Quaternion型
3. 回転の最大角度 : float型

返り値(戻り値)

ある回転からある回転への回転 : Quaternion型

○ 使い方
クォータニオンを目標の回転に向けて回転させたい時に使用します。

Quaternion q = Quaternion.RotateTowards(transform.position,目標のゲームオブジェクト.transform.position,1.1f);

Slerp

2つの回転を0〜1の間で補間し、正規化します。

これは球面線形補間です。

1. 基準となる回転 : Quaternion型
2. 目標の回転 : Quaternion型
3. 0〜1の補間係数 : float型

返り値(戻り値)

球面線形補間された回転 : Quaternion型

○ 使い方
回転と回転の間の値を得たい場合に使用します。

Quaternion q = Quaternion.Slerp(transform.rotation,目標のゲームオブジェクト.transform.rotation,0.1f);

SlerpUnclamped

2つの回転を補間し、正規化します。

これは球面線形補間です。

この時、補間は1以上を指定することができます。1以上を指定すると目標の回転を通り過ぎます。例えば2を入れると基準から目標への回転の2倍回転します。

1. 基準となる回転 : Quaternion型
2. 目標の回転 : Quaternion型
3. 補間係数 : float型

返り値(戻り値)

球面線形補間された回転 : Quaternion型

○ 使い方
回転と回転の間の値を得たい場合に使用します。また、目標を通り過ぎたい場合に便利です。

Quaternion q = Quaternion.SlerpUnclamped(transform.rotation,目標のゲームオブジェクト.transform.rotation,1.1f);

Static変数や関数、メッセージなどがわからない方は↓の記事を参考にしてみてください