まず動きの土台
判断を乗せる体は、行きたい向きへ少しずつ曲がる点。標的へまっすぐ向かう速度を desired として、今の速度との差を取る。その差を上限つきの力にして毎フレーム速度へ足すと、向きが急には変わらず、慣性のついた弧になる。
標的へ向かう操舵は steer = desired − velocity で出る。desired は標的方向の最大速度ベクトル、velocity は現在の速度。その差を最大値で頭打ちにしてから速度へ足し、速度も最大値で頭打ちにする。Craig Reynolds が 1999 年の論文でまとめた steering behaviors の基本形。向かう seek、止まりに行く arrive、ふらつく wander などをすべて「向きを返す力」として書き、足し合わせて一つの操舵にする。判断は体に desired を渡すだけで、力に変える部分は共通の部品になる。
複数の点を四隅と各辺の中央に置いて、画面の真ん中あたりを回る標的へ向かわせる。各点で desired を標的方向の最大速度に取り、今の速度との差を maxForce で頭打ちにして速度へ足す。
四隅の点が標的へ集まり、標的が向きを変えるたびに大きく弧を描いて回り込む。差を maxForce で頭打ちにしているので、向きの変化が一拍遅れて、直角には曲がれない。標的へ向かうだけの seek。標的の上で点が振り子のように行き過ぎて戻るのは、止まる仕組みがまだ無いため。
止まりに行くには、標的に近いほど desired を細らせる。距離が slow を切ったら最大速度を距離の比で縮め、ゼロに近づくと desired もゼロへ寄って減速する。近づくと止まる arrive。向きを絶えず小さくゆらすと、標的を追いながら気まぐれに揺れる。ゆらし量を角度で持ち、その角度を毎フレーム少し回して cos・sin の微小な力に変える。向きをふらつかせる wander。三つの力を同じ速度へ足し込む。
三角が標的のまわりに寄って、近づくと振り子の行き過ぎが消えて滑らかに止まりに行く。止まりきらずに微かに揺れているのが wander の効き。slow を大きくすると遠くから減速を始めてゆったり寄り、0 に近づけると arrive が消えて seek の振り子に戻る。wander のゆらし量を上げると標的を外れてふらつき、下げると一直線に詰める。seek・arrive・wander のどれも desired を作って速度との差を足すだけで、三つを足し合わせた合力が一つの操舵になる。