回転

対象を追尾する弾を撃つ場合、必要となるパラメータはなんだろう。
まずは、対象の位置と、弾の初期位置と初期向き。弾の初期向きは、アップベクトルがが常にワールドY軸と一致するとか見た目にこだわらないという場合は必要ないが、追尾の途中で宙返りした場合はアップベクトルも下方向にしたいとかがありそうなので必要となってくる。
それから、弾の初速度と加速度、最大速度。等加速度であれば加速度の代わりに最大速度に達する時間でもOK。そういえば等加速度以外は試したこと無い。
そして、旋回速度と旋回加速度、最大旋回速度。ここで旋回速度とは、単位時間あたりの対象方向へ回転する角度とする。旋回加速度は単位時間当たりの旋回速度の増加値。
最後に、追尾を中止する条件。これはものによっていろいろあって、例えば、「弾から対象までの距離」、「弾の方向と弾から対象までの角度差」、「発射してからの経過時間」なんかが多分ポピュラーなもの。これをうまく設定しておかないと、対象の周りをずっとぐるぐると回り続けてしまったりする。速度の割に旋回速度が小さいだけならまだしも、弾の性能よりも対象の機動性のほうが高い場合にも起きる問題なので、これらの条件設定以外に適切な対処法はない、はず。
これらのパラメータを使用して、毎回、向きの更新と位置の更新を行うだけ。調整がめんどうだけど仕組みはシンプルで簡単だ。…そう思っていた時期が僕にもありました。
ふと気づいたのが、弾から見て左右方向の動きには強いが、上下方向には弱いなんていう追尾性能を実現するにはどうすればいいんだろう。地面を動き回っている限りはしつこいけど、ジャンプをすれば簡単に買わせる弾とか作るにはこれが必要じゃないだろうか。これを使えば、誘導弾を撃ってきた敵の直前でその弾をジャンプして避けると、誘導弾が敵にも当たる遊びができておもしろいかも。
実現する方法として単純に考えられるのは、旋回速度を、X軸回転に対する旋回速度と、Y軸回転に対する旋回速度に分けること。Y軸回転の旋回速度に比べてX軸回転の旋回速度を弱くすれば、さっきの遊びは実現できそう。
ただ、今までは回転の処理を、現在の向きから目標の向きまでの補間で行っていたが、それを単純にオイラー角による回転にしてしまっても大丈夫なのだろうか。現在の向きを回転後の向きにする回転行列を求める。次にその回転行列からオイラー角を求める。求めたオイラー角のX軸回転、Y軸回転を、それぞれの最大旋回速度内に収まるよう制限する。制限をかけたオイラー角から回転行列を求め、現在の向きを回転させる。…なんか怪しい。もともとの回転行列は、自由軸回転を行う。一方でオイラー角の場合、X軸、Y軸、Z軸それぞれの回転を組み合わせて行う。軸1つの回転から、軸3つの回転に変換しているわけだ。単純な変換であれば、それが等しいことが証明されているらしいので問題は無いが、では、変換したものに手を加えた場合はどうか? …駄目な気がする。
う〜ん、わかんない。そもそも自由軸回転にしていていいのかが怪しくなってきた。自由に回転できるものならともかく、砲台のように位置が固定されていたり、地形的な制約、例えば上に壁があるから上方向には30°までしか回転できないとか、そういった場合にまずいんじゃないだろうか。