ゲームプログラマになる前に覚えておきたい技術に載っていた方法。ただし、そのままではなくちょっと変えている。
基準はZ軸プラス方向。そこからどのくらい回転すれば良いかを求めている。
vector target; // 目的の位置 float ax; // x軸回転角度(首を上げる角度) float ay; // y軸回転角度(体を回す角度) // まず見上げる角度を求める float xzDistance = sqrt( target.x*target.x + target.z*target.z ); ax = atan2( target.y, xzDistance ); // 次にその方向へ向く角度を求める ay = atan2( target.x, target.z );
順番としては目的の高さまで見上げてから、目的の方向へ向く。まずx軸回転をしてから、次にy軸回転を行う。先にy軸回転をしてしまうと見上げるための回転軸がx軸ではなくなってしまうので計算が面倒になる。
この方法では上下方向が常にy軸と等しい場合のみ。首を傾けているような場合には使えない。
21日追記
ふと思ったのだが、見る角度というよりも、指定した点に移動する角度といったほうがいいかもしれない。