同次変換行列 ... 回転行列 ... クォータニオン ...
座標は列ベクトルで表現する。
|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座標系への回転量になる。
なんか、まとまんないけど、とりあえずメモ。