同次変換行列 ... 回転行列 ... クォータニオン ...

座標は列ベクトルで表現する。

    |x|
p = |y|
    |z|

空間は右手系で構成する。 (OpenGLと同じ。一般的な工学の説明とも同じはず)
例えば、点pをZ軸まわりにθ回転させた点p'の座標を求めるには、

     |c -s 0|
p' = |s  c 0| p
     |0  0 1|

これの見方を変えて、world座標系上で(x, y, z)^Tと表される点p_wがcamera座標系では、どういった座標 p_c になるかと考えてみる。つまり、world座標系に対してcamera座標系が-θ回転した位置にあると考えると、同じ式で表現できる。

p_c = cHw p_w
      |c -s 0 0|
p_c = |s  c 0 0| p_w
      |0  0 1 0|
      |0  0 0 1|

クォータニオン (Quaternion) は、"ある軸 (v) まわりに、ある角度回転 (θ) する"ってことを表現してるようなもの。

q = (w, (x, y, z))
w = cos(θ/2)
x = v.x * sin(θ/2)
y = v.y * sin(θ/2)
z = v.z * sin(θ/2)

クォータニオン (w, (x, y, z)) を回転行列 (R) に変換するには、

    |1-2y^2-2z^2 2xy-2zw     2xz+2yw    |
R = |2xy+2zw     1-2x^2-2z^2 2yz-2xw    |
    |2xz-2yw     2yz+2xw     1-2x^2-2y^2|

同次変換行列 cHw の回転成分に含まれている角度は、world座標系からcamera座標系への回転量。
cHw の回転成分を転置したら、その行列に含まれている角度は、camera座標系からworld座標系への回転量になる。

なんか、まとまんないけど、とりあえずメモ。