クォータニオン
Quaternion、四元数
クォータニオンは、虚数単位$ i・$ j・$ kを用いて、 $ (x, y, z; w) = xi + yj + zk + w
で表される
$ i・$ j・$ kは、以下の関係を満たす
$ i^2 = j^2 = k^2 = ijk = -1
乗積表にすると、以下の通り
table:table
* 1 i j k
1 1 i j k
i i -1 k -j
j j -k -1 i
k k j -i -1
$ \begin{bmatrix} w_1 \\ x_1 \\ y_1 \\ z_1 \end{bmatrix} * \begin{bmatrix} w_2 \\ x_2 \\ y_2 \\ z_2 \end{bmatrix} = \begin{bmatrix} w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2 \\ w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2 \\ w_1 y_2 - x_1 z_2 + y_1 w_2 + z_1 x_2 \\ w_1 z_2 + x_1 y_2 - y_1 x_2 + z_1 w_2 \end{bmatrix}
絶対値・共役・逆
$ |q| = \sqrt{w^2 + x^2 + y^2 + z^2}
絶対値が1のクォータニオンを単位クォータニオンと呼ぶ
クォータニオンの正規化は$ {\rm normalize}(q) = \frac{q}{|q|}とできる $ \bar q = w - xi - yj - zk
$ q^{-1} = \frac{\bar q}{|q|^2}
単位クォータニオンのとき、$ \bar q = q^{-1}
回転での利用
クォータニオンは、CG文脈において、回転によく用いられる 基本的には単位クォータニオンとして正規化して使いたい だいたいDCCでわけわからん挙動だ~~~って絶叫しているやつは、内部的に正規化されてたり・正規化されていなくてスケールが変わっていたりしてわけわからんくなっている
クォータニオンのベクトルへの適用をする際は、
$ p = (v_x, v_y, v_z; 0)
と置いた上で
$ q^{-1} \ p \ qして、結果から$ x・$ y・$ zを取り出す
Axis-Angle
回転軸を$ u・回転角を$ \thetaとしたとき、
$ u = {\rm normalize} \left( q_x, q_y, q_z \right)
$ w = \cos(\theta / 2)
$ \theta = 2\ {\rm acos}(q_w)
クォータニオンおてがる角度早見表
table:table
w x θ deg turn
1.000 0.000 0 0 0.000
0.966 0.259 1/6 π 30 0.083
0.924 0.382 1/4 π 45 0.125
0.866 0.500 1/3 π 60 0.167
0.707 0.707 1/2 π 90 0.250
0.500 0.866 2/3 π 120 0.333
0.000 1.000 π 180 0.500
-0.707 0.707 1.5 π 270 0.750
-1.000 0.000 2 π 360 1.000
code:js
const x = Math.sqrt(1.0 - w * w);
const theta = 2.0 * Math.acos(w);
const deg = 180.0 / Math.PI * theta;
const turn = theta / 2.0 / Math.PI;
});