方向ベクトルと長さ

http://d.hatena.ne.jp/kenmo/20050817#p1

「移動量は極座標にするべきだにゃーー!!」
なんてことを書いたわけですが、
これにはちょっとした欠点がありまして、、。
 
それは、極座標同士の加算・減算の手順が面倒、ということです。
 
例えば、

  • 45°方向に5のスピード
  • 135°方向に3のスピード

という2つの移動量を加算する場合、
x1=\cos(rad(45))*5
y1=\sin(rad(45))*5
x2=\cos(rad(135))*3
y2=\sin(rad(135))*3
というように一度直交座標に変換して、
x=x1+x2
y=y1+y2
としてやる必要があります。
 
さらにこれを極座標の移動量に変換するには、
speed=\sqrt{x*x+y*y}
degrees=atan(y/x)
となってしまいます。
 
このsin()/cos()→atan()/sqrt()という無駄な処理を何とかしたいなー、
と思っていたわけですが、
kenmoの知識ではなんともなりませんでした(´Д`;
 
で、なんとなく
ゲームプログラミングのための数学と物理
を読んでいたら、玉突きゲームの衝突処理のところで、
移動量を「方向ベクトルとスピード」を使っているのを見つけて、
なるほどー、と思ったわけです。
 
この方法なら、

  • 単位ベクトル(x,y)=(0.707,0.707)、スピード5
  • 単位ベクトル(x,y)=(-0.707,0.707)、スピード3

という情報を持っておけば、
x=5*0.707+3*-0.707=1.413
y=5*0.707+3*0.707=5.655
となり、簡単に移動量の加算ができてしまいます。
 
単位ベクトルとスピードに戻す場合は、sqrt()と正規化で求められますね。
 
あと「スピード」が使えるので「加速減速」がやりやすいのも利点です。
ただ、方向転換するときはsin()/cos()/atan()を使う必要はあるのですがー。
 
ということでまとめです。

この3つのステップを踏むことで、
敵キャラの動きとかの細かい制御が容易になると思います。