こんにちは。ヤマヤタケシです。
クォータニオンについての質問をいただきました!
できるだけ答えます!
クォータニオンは数学の概念です。ベクトル、行列、クォータニオンです。
クォータニオンは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
そんじゃまた。