はじめに
「任意軸回りの回転が回転行列である」ことと「回転行列の積は回転行列である」こと、この2つのことを当たり前のように使っていたけど、
確認してなかったなとおもったので計算することで確認しました。
任意軸回りの回転が回転行列であるかの確認
先に、任意軸回りの回転が回転行列であるかの確認をします。
回転軸を表す単位ベクトルを とし、回転角を とすると、回転行列 は以下のようになります。
が式 を満たすことを確認すればよいことになります。
手計算ではなくSymPyを使って計算しました。
from sympy import * init_printing() var('theta,a_x,a_y,a_z') c = cos(theta) s = sin(theta) M = Matrix([ [c + a_x ** 2 * (1 - c), a_x * a_y *(1 - c) - a_z * s, a_x * a_z * (1 - c) + a_y * s ], [a_x * a_y *(1 - c) + a_z * s, c + a_y ** 2 * (1 - c), a_y * a_z * (1 - c) - a_x * s ], [a_x * a_z * (1 - c) - a_y * s, a_y * a_z * (1 - c) + a_x * s, c + a_z ** 2 * (1 - c) ], ]) display(M) Mdet = my_simplify(M.det()) display(Mdet) MMT = my_simplify(M.transpose() * M) display(MMT) def my_simplify(m): subs = [ (a_x ** 2 + a_y ** 2 + a_z ** 2, 1), (a_x ** 2, 1 - (a_y ** 2 + a_z ** 2)), (a_y ** 2, 1 - (a_z ** 2 + a_x ** 2)), (a_z ** 2, 1 - (a_x ** 2 + a_y ** 2)), (cos(theta) ** 2 + sin(theta) ** 2, 1), ] m = expand(m) m = m.subs(subs) m = simplify(m) m = m.subs(subs) m = expand(m) return m
プログラムの実行結果
以上より、 が式 を満たすので、任意軸回りの回転が回転行列であることがわかりました。
回転行列の積は回転行列なのか確認
さて、本丸の回転行列同士の積が回転かどうかの確認です。
もう1つ回転行列を用意します。
回転軸を表す単位ベクトルを とし、回転角を とすると、回転行列 とします。
このとき、上記の議論より、 も式 を満たします。
見やすくするため、 とおきます。
を計算します。
を計算します。
式 より、回転行列の積 が式 を満たすので、回転行列の積は回転行列であることが示せました。
参考文献
3次元回転 パラメータ計算とリー代数による最適化 p9