複数軸回転と回転行列の扱い方について
座標系を回転させたいときの基本
座標系を回転させたい場合は、
点を「回転させたい方向と逆方向」に回転させればよい。
これはこれまで述べてきた通りで、
実装上は「座標系を回す」のではなく
点に回転行列を掛けることで表現する。
複数回転する場合はどうするか
次に、座標系を複数回転させたい場合を考える。
結論から言うと、
回転時に使用した回転行列の転置行列を使えばよい
ということになる。
なぜ複数回転が必要なのか
ほとんどの3次元問題では、
1軸だけの回転で理想的な座標系に一致することは少ない。
例外としては、
Yaw軸だけを揃えたい場合などが挙げられるが、
多くの場合は X・Y・Zの3軸回転 を考える必要がある。
ローカル系で物体を定義する理由
そもそも、なぜ物体はローカル座標系で定義するのか。
例として、鉛筆を考える。
- ワールド系から見た鉛筆の長さ
- 鉛筆の先端を基準にした鉛筆の長さ
どちらが扱いやすいかというと、
明らかに後者である。
鉛筆を投げようが、回転しようが、壊れようが、
鉛筆自身のローカル系で見た長さは常に一定だからだ。
一方で、ワールド系では姿勢が変わるたびに
数値が変化してしまう。
このため、
物体はローカル系で定義し、
必要に応じてワールド系へ変換する
という考え方が重要になる。
ローカル系とワールド系の変換
ローカル系をワールド系から定義する場合、
通常は X・Y・Zの3軸回転 を順番に行う。
このとき注意すべき点は、
- 回転には順番がある
- 元に戻すときは 回転させた順番の逆順で戻す
ということだ。
その結果、次のような形で扱うことになる。
- X回転行列
- Y回転行列
- Z回転行列
を順番に掛け合わせ、
点(X, Y, Z)に適用することで、
ローカル系・ワールド系の行き来を行う。
回転行列を1つにまとめる考え方
毎回、
「座標系を回したから、点を逆に回す」
という操作を軸ごとに繰り返すことも可能だが、
実務的にはあまり現実的ではない。
そこで、通常は
-
ワールド系 → ローカル系 への変換用回転行列
(ここでは World2Local とする)
をあらかじめ定義する。
転置行列で行き来する
回転行列は直交行列であるため、
逆行列 = 転置行列
が成り立つ。
そのため、
- World2Local の転置行列を使えば
- Local → World の変換が可能になる
関係式
- World2Local × ワールド座標 = ローカル座標
- World2Localᵀ × ローカル座標 = ワールド座標
このように、
- 回転行列を1つ定義しておけば
- 転置を使うだけで座標系を行き来できる
という、非常にシンプルな構成になる。
まとめ
- 座標系は直接回さない
- 点に回転行列を掛ける
- 複数回転は1つの回転行列にまとめる
- 行き来には転置行列を使う
この考え方を押さえておくと、
3次元座標変換で迷うことがかなり減る。