Unity的クォータニオン(Quaternion)についての質疑応答のコーナー

こんにちは。ヤマヤタケシです。
クォータニオンについての質問をいただきました!
できるだけ答えます!
クォータニオンは数学の概念です。ベクトル、行列、クォータニオンです。
クォータニオンは3次元空間の角度というか姿勢を表現できます。
細かい数学よりはunityならどうするかという視点で答えます。
ゲーム業界用です。
数学の細かいところは忘れました。
でも、それはUnityが実装済みなので、使えれば問題ないし、むしろ使って面白いことをやるのが目的です。

質問1.
例えば腕の回転に対して、別オブジェクトがねじり方向(x方向)だけ打ち消す動きをさせる動きはできるのか?

これはクォータニオンというよりは姿勢の生成です。
1. Quatenionからマトリクスを生成(Matrix4x4.TRS)
2. マトリクスからx軸を抜き出します。(Matrix4x4.GetColumn(0))
3. 腕の方向(x方向)をview、ねじり方向を調整するためupベクトルを指定 Quaternion.SetLookRotation します。

Quaternion.SetLookRotation
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.SetLookRotation.html

質問2.
オイラー回転の、rotの値/2みたいな計算はどうやるのかのか?

y軸に30度回転している -> y軸に15度回転している
1. 回転なしの状態 (0,0,0,1) を作成. (Quaternion.identity)
2. y軸に30度回転している今の状態と、0.5で球面補間します。(Quaternion.Slerp)

回転なしクォータニオン(単位回転)
Quaternion.identity
public static Quaternion identity ;
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion-identity.html

球面補間
Quaternion.Slerp
public static Quaternion Slerp (Quaternion a, Quaternion b, float t);
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.Slerp.html

質問3.
ヨー、ピッチ、ロールで回転を制御するにはどうすればいいのか?

ヨー(y軸)、ピッチ(x軸)、ロール(z軸)だとすると、x軸で回転するクォータニオンを生成して、掛け算します。

オイラー角で生成
Quaternion.Euler
public static Quaternion Euler (float x, float y, float z);
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.Euler.html

軸と角度で生成
Quaternion.AngleAxis
public static Quaternion AngleAxis (float angle, Vector3 axis);
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.AngleAxis.html

掛け算
Quaternion.operator *
public static Quaternion operator * (Quaternion lhs, Quaternion rhs);
(unity) : https://docs.unity3d.com/ja/current/ScriptReference/Quaternion-operator_multiply.html

そんじゃまた。