Action script3.0 アニメーション

ブログの更新が滞っていましたが、何もしていなかったわけではないです。 少しづつやったましたが、さすがにわからない所もでてきました。 今回は、メモ代わりにその辺を書いていきたいです。

Chapter11 ビリヤードボールの物理

この章までは、質量がなかったですが、11章から登場してきた概念です。12章のパーティクルにも出て来ます。 その中で「運動量の保存」が全然わからない。高校も物理より生物に逃げたので、からっきしこの分野は苦手。

公式:オブジェクト0、1の最終速度。

v0Final = (m0 - m1) * v0 +2 * m1 * v1 / (m0 + m1) v1Final = (m1 - m0) * v1 +2 * m0 * v0 / (m0 + m1)

公式を見ても全然わからないですね。 m1はオブジェクト1が持つ質量。v1は速度。

より具体的にAction scriptで書くとこうなります。

var vx0Final = ((obj0.mass - obj1.mass) * obj0.vx + 2 * obj1.mass * obj1.vx) / (obj0.mass + obj1.mass); var vx1Final = ((obj1.mass - obj0.mass) * obj1.vx + 2 * obj0.mass * obj0.vx) / (obj0.mass + obj1.mass);

後はこれを角速度に代入していけばOKです。 さらに最適が本に載っています。

var vxTotal:Number = obj0.vx - obj1.vx; obj0.vx = ((obj0.mass - obj1.mass) * obj0.vx + 2 * obj1.mass * obj1.vx) / (obj0.mass + obj1.mass) vx1Final = vxTotal + vx0Final;

今見ても本当によくわかりませんし、本にもありますが、しっかりと理解をする必要もないとのこと。うーん難しいな。

chapter10 座標回転と角度に対する跳ね返り

角度のついた跳ね返り。前の章で画面の外枠にあたった際の跳ね返りは学びました。マイナス(ー)をつけて逆方向にしてやれば良かったんですが。 今回は、角度のあるオブジェクトにあたった際の運動の仕方を考えています。 この本では、座標と速度を回転させ、一旦水平の状態にして跳ね返りを実行させ、その後に座標と速度を戻すという方法が載っています。

(線を基準としたオブジェクトの位置の取得) var x1:Number = obj.x - line.x; var y1:Number = obj.y - line.y;

(座標の回転) var x2:Number = cos * x1 + sin * y1 ; var y2:Number = cos * y1 - sin * x1;

(速度の回転) var vx1:Number = cos * obj.vx + sin * obj.vy; var vy1:Number = cos * obj.vy - sin * obj.vx;

これで角度のある線の角度が無くなり、その際の速度を出すことができます。 実際の跳ね返りの実行。(y2はオブジェクトの真ん中をさしている。これが、0よりも大きければ。)

if( y2 > -obj.height /2){ y2 = 0 -obj.height /2; vy1 *= bounce;

Chapter09 衝突判定

まず良くわからなかったところのコードを書きます。

private function onEnterFrame(event:Event):void{

for(var i:Number = 0; i < ボールの数 - 1; i++){ var ball0:Ball = balls[i]; for(var j:Number = 0; j < ボールの数 ; j++){ var ball1:Ball = balls[j]; var dx:Number = ball1.x - ball0.x; var dy : Number = ball1.y - ball0.y; var dist:Number = Math.sqrt(dx * dx + dy * dy); var minDist :Number = ball0.radius + ball1.radius; if(dis < minDIst){ var angle:Number = Math.atan2(dy,dx); var tx:Number = ball0.x + Math.cos(angle) * minDist; var ty:Number = ball0.y + Math.sin(angle) * minDist; var ax:Number = (tx - ball1.x) * spring; var ay:Number = (ty - ball1.y) * spring; ball0.vx -=ax; ball0.vy -=ay; ball1.vx +=ax; ball1.vy +=ay;

dis < minDistは、ボールの半径の合計がボールの距離より大きい場合。つまり、ボール同士が衝突した瞬間。 angleはボールの角度を出している。 tx,tyは目標のポイントを定めている。 ax,ayはバネ。 ball1.vx,ball1.vyはボール加速を表している。 ball0.vx,ball0.vyは逆のバネ運動。

まだまだわからないところが多いので、これは復習をしっかりして、応用ができるようにしていきます。