[AS]バネの動きの考え方について
とりあえずよくわすれるからメモ
バネの動きについて
原則としては、
単位時間での、「目的位置」 – 「現在位置」を「加速度」と設定する。
この加速度でオブジェクトを動かせばそれはバネの動きとなる。
ステージにball_mcをおいた状態でのフレームアクション
簡単に書くと、
//初速度 var v0x:Number=0; //速度 var vx:Number=0; addEventListener(Event.ENTER_FRAME, entarFrameHandler); vx=v0x; function entarFrameHandler(e:Event):void { //マウス位置とボールの位置の差を加速度とということにする //つまりは目的位置 - 現在位置 を加速度にするということ。 //この加速度は毎フレームごとで当然変化する。 //良くわからんが、(目的位置 - 現在位置) で求めた加速度はバネの性質を持つ var ax = mouseX - ball_mc.x; //速度に加速度を単位時間毎に足すということ vx += ax; //位置に速度を単位時間毎に足すということ //ここでの速度はマウス位置で変化 ball_mc.x+=vx; }
ただしこれだと、バネは収束しないので二つのパラメータを設定して制御。
空気抵抗:1以下の数値を設定し、バネの収束する速度を調整
バネ定数:1以下の数値を設定し、バネの硬さを調整(小さい方が軟らかくなる)
//初速度 var v0x:Number=0; //速度 var vx:Number=0; //バネ定数(1以下、数値を上げるほど硬いバネ) var spring:Number = 1; //空気抵抗(数値を下げるほど、行ったり来たりが短く) var friction:Number = 0.9 addEventListener(Event.ENTER_FRAME, entarFrameHandler); vx=v0x; function entarFrameHandler(e:Event):void { //マウス位置とボールの位置の差を加速度とということにする //つまりは目的位置 - 現在位置 を加速度にするということ。 //この加速度は毎フレームごとで当然変化する。 var ax = mouseX - ball_mc.x; //加速度にバネ定数をかける //良くわからんが、(目的位置 - 現在位置) * バネ定数で求めた加速度はバネの性質を持つ //(目的位置 - 現在位置) (* バネ定数:かけなくてもバネっぽい動き)で求めた加速度、これを忘れないように。 ax = ax * spring //速度に加速度を単位時間毎に足すということ vx += ax; //速度に空気抵抗かける vx *= friction; //位置に速度を単位時間毎に足すということ //ここでの速度はマウス位置で変化 ball_mc.x+=vx; }
Tweet