おもちゃラボ

Unityで遊びを作ってます

Unityでバネモデル

Unityで小ネタアニメーション、第7回はバネモデル(spring)です。バネ動作のアルゴリズムは、第4回で説明したイージングのアルゴリズム(Unityでイージング - おもちゃラボ)と非常に似ていて、イージングのアルゴリズムを少しだけ書き換えるだけで、なんとバネの動作になります。

作るもの

作るものは下記のような感じです。イージングが、目的地にすぅ〜っと近づいていくのに対して、バネはバネらしくビヨンビヨンします。今回は直線的な動きですが、同様のアルゴリズムを拡大縮小や回転などにも同様の効果を適応することができます。


- YouTube


アルゴリズム

上に書いたとおり、バネ動作のアルゴリズムは、イージングのアルゴリズムに非常に似ています。イージングのアルゴリズムが、毎フレームごとに目的地と現在地の差分ベクトルを現在の位置ベクトルに足し込んでいたのに対して、バネ接続では、差分ベクトルを現在の速度ベクトルに足し込みます。

f:id:nn_hokuson:20141203212900j:plain

またバネ接続の場合、差分ベクトルを速度に足し込むだけでは永遠にビヨンビヨンしてしまうので、適当にダンピングファクタを速度ベクトルに掛け合わせることで、だんだん振幅を減衰させてやります。

プログラム

バネモデルとイージングモデルの2つのプログラムは非常に似ているので、比べて書いてみます。違っているのは、アルゴリズムの章でも書いたように2点間の差分ベクトルを現在地に足し込んでいるのか、速度に足し込んでいるかの違いだけですね。

イージングの場合

Vector3 diff = target.transform.position - transform.position;
Vector3 v = diff * EASING;
transform.position += v;

バネモデルの場合

Vector3 diff = target.transform.position - transform.position;
v += diff * SPRING;
v *= DAMPING;
transform.position += v;

SPRINGの値を大きくすると、振幅が大きくなり、DAMPINGを小さくすると振動する時間が短くなり(減衰しやすく)なります。思い描いたアニメーションになるようにこの2つのパラメータを調整して下さい。

今回使ったC#のスクリプトを置いておきますので
参考にしていただければと思います。

バネモデルのサンプル


参考書籍