正円周上の2点の小さい方の角度2 と Boid
前エントリーから続き
イメソの花井さんがすばらしい答えをくれたので、まとめ。
正円上の点c1からc2にいきたいとき。
それぞれのrは正円の中心を原点として、X軸の+の方向が0度のときの角度。
var s = Math.sin((this.c2.r-this.c1.r)*Math.PI/180);
var direction = s/Math.abs(s);
↓(修正)
var direction = ( Math.sin((this.c2.r - this.c1.r) * Math.PI / 180) > 0 ) ? 1 : -1;
(FladdictさんのBlogのコメントされてたかたからの指摘で、最終的にこれがBEST
ということになりました。)
ということで解決!
で、さらに、トラックバックをくれたFladdictさんにちょっとはしょってコメントしてしまったことの補足。
ある特定の目標の方向を向きたいときに、右に回転するべきか左に回転するべきか判別する処理。頭よさげな追尾ミサイルとか敵とか作るのに使った気がする。正円上を進むわけではない場合、こういうシチュエーションでは僕はベクトルで計算しています。 たとえば、オブジェクトP1がP2に進みたい場合、たとえばP1はもともと進行方向をもっていたりします。こういう場合にあまりに急に角度が変わったりすると不自然なので、今の進行方向から、ターゲットP2にあたるように進行方向をだんだん変えていきたい場合とかにはベクトルを使うと便利です。
P1の現在位置を、(_x,_y) 、P1の最初の進行方向ベクトルを(vx, vy)、スピードをspeedとします。P2も同様ですでに動いているとします(とまっている場合はベクトルが0になっているだけです)。進行方向ベクトル(vx, vy)は正規化されたベクトルです。ベクトルの正規化については後述します。
p1内のスクリプトです。
this.v = this.normalize(5,3); //x軸に5進むと、y軸に3進むというベクトルを正規化
this.onEnterFrame = function(){
var v2 = this.normalize(_parent.p2._x - this._x, _parent.p2._y - this._y);
//v2 は自分の現在位置から、ターゲットp2の現在位置への正規化されたベクトルです
var vc = this.normalize(this.vx*0.3 + v2.x*0.5 + _parent.p2.vx * 0.1, this.vy*0.3 + v2.y*0.5 + _parent.p2.vy * 0.1);
//0.3,0.5,0.1などは適当な値、それぞれの比率によって、ターゲットへどれくらいなだらかに進行方向を変えるかというようなバランスが変わってくる。たとえば、0.3の部分は自分の最初の進行方向になるのでこの比率を高くすると、ターゲットに対して追尾能力の甘いミサイルになる
this._x += vc.x * speed;
this._y += vc.y * speed;
this._rotation = ((Math.atan(this.vy/this.vx)/Math.PI+(this.vx<0))*180+720)%360;
//実用的には、ミサイルなどの場合造形に方向性がある(弾頭とか、尾翼とか)ので、ムービークリップの角度を進行方向に応じて変えてやる必要がある。
}
this.normalize = function(x, y) {
var size = Math.sqrt(x*x+y*y);
if (size>0) {
x = x/size;
y = y/size;
} else {
x = 0;
y = 0;
}
var nv = new Object();
nv.x = x;
nv.y = y;
nv.size = size;
return nv;
};
という具合です。
ちなみに、_rotationで回転させるときに、右向きが0度になるので、そのようにMC内に画像を配置する必要があります。
こんな感じです。

こういうベクトルの加算を基本にして、生き物の群体行動のシュミレーションにBoidというのがあります。前にもweb designingで連載しているときに書いたけど、たとえば鳥の群れの適当そうでなんとなく、自然にある方向に流れていくような動きをシュミレーションするものです。群れ全体が向かっているベクトルや近くにいるほかの生き物にあたりそうになったら、スピードを落としていくとか、そういうベクトルをあわせていくわけです。
細かくは省きます・・
こういうのに使ったりしてます。去年の夏ごろにフマキラーのフローティングバナーを作ったときのものです。
フマキッズバナー
ダンゴムシの歩く動きや、メガボールの歩く動きはBoidを簡単にしたような感じのプログラムで動いています。
| カテゴリ | : | action script |
| trackback url | : | http://blog.tokyoace4.com/cgi-bin/mt/mt-tb.cgi/622 |
(コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。)