3Dでの回転、移動の基礎

わざわざ色々調べて書くことはあるんだけど、ちょろっと繋ぎの簡単な話です。

最近、ゲームエンジンやらが便利なおかげで3Dの基礎的な知識がなくても3Dのゲームを作れたりするけども、なんだかんだ言っても知識がないと思った通りに動かなかったりする。
ということで、3Dでの回転と移動という動きの話。
まあ、こんな話を書くのは、この辺りの知識がなくても出来てない人を見たからなんだけども。

では、とりあえず机上の話ではなく、実際に体を動かして3Dを体感しよう。
なんていったって最も身近な3D環境は現実なんだから。

椅子と机に張り付かずに立ち上がってみよう。
立ち上がったら今いる位置を覚えておく。
それから、以下の順番で動く。
1. 右45度の方向に体を向ける
2. 前に一歩移動する

はい、簡単ですね。よくできました。
じゃあ、今度は逆の動きをして元の位置に戻ってみよう。
1. 左45度の方向に体を向ける
2. 後ろに一歩移動する

元の位置に戻れた人、ハーイ!
その人は最初からやり直しましょう。
元の位置に戻れなかった人は正しいです。

逆のことをしたのに元の位置に戻れないのはなぜか。
それは回転と移動の順番を逆にしていないから。
元の位置に戻るための正しい手順は以下。
1. 後ろに一歩移動する
2. 左45度の方向に体を向ける

というように、3Dでは回転と移動の順番が非常に重要で、これを間違えると思った通りの移動ができない。
例えば回転と移動の量を渡すとその通りに動かしてくれる関数があるとする。
これで今やったように回転と移動をした後、元の位置に戻すために逆の値を渡すとどうしても同じ位置には戻ってくれない。
なので、回転を行う関数と移動を行う関数を別々に呼び出して回転と移動をする必要がある。

まとめてやってくれるのは便利だけど、順番だけは気にしてやらないといけない。
ゲームエンジンとかを使うのであれば、まとめて回転と移動をしてくれる関数を使うとその順番がどうなっているかは見えにくいので、最初から回転と移動を別で行った方が実はいいのかもしれない。