おもちゃラボ

Unityで遊びを作ってます

Unityで偽ソフトボディ

Unityの小ネタアニメーション第五回目はなんちゃってソフトボディです。ソフトボディ(軟体)の表現としてはバネモデルがよく使われますが、今回はなんちゃってソフトボディなんで、バネなんて高級なものは使いません。見た目がうにゅっとすればいいんです、なんちゃってですから。


作るもの

画面上方から正方形の物体が降ってきて、着地した瞬間に少しだけひしゃげます。ほんの数十msのアニメーションで、人はその物質が硬いか柔らかいか、簡単に想像できてしまうなんてすごいですね〜。今回の結果は↓のようになります。


- YouTube

ひしゃげるアニメーションだけだと少し寂しかったので音もつけてみました(笑)ドラムの音を着地した瞬間にランダムに鳴らしているだけですが、なんとなくそれっぽくて、結構気に入っていたりします^^;

アルゴリズム

バネモデルのソフトボディでは下図のような感じで正方形の各辺と対角線にバネをしこんで、毎フレームごとに物理演算をしますが、なんちゃってソフトボディでは見た目だけでカバーします。

f:id:nn_hokuson:20141113235053p:plain

アルゴリズムとしては、着地したら重力方向に対してスケールを小さくしていくのと同時に、水平方向に対してはスケールを大きくしていきます。

f:id:nn_hokuson:20141113234927j:plain

重力方向に縮みきったら、逆の操作で重力方向のスケールを大きくし、水平方向のスケールを小さくします。これで、もとの正方形に復元しました。

f:id:nn_hokuson:20141113234937j:plain

プログラム

Vector3 ds = transform.localScale;
for (int i = 0; i <= 180; i += 10) 
{
	transform.localScale = new Vector3 (
		ds.x + 0.25f * Mathf.Sin (i * Mathf.Deg2Rad),
		ds.y - 0.25f * (Mathf.Sin (i * Mathf.Deg2Rad)),
		1);						
	yield return new WaitForSeconds (0.016f);
}

プログラムは正方形を伸縮させる部分だけのせています。重力方向、水平方向のスケールはどちらも振動運動で表現できるので、三角関数を使っています。アニメーションループに入る前に、元の正方形のスケールをデフォルトスケールとして覚えておき、デフォルト値からひしゃげる分のスケールを増減することでなんちゃってソフトボディのアニメーションを実現しています。

今回はx方向、y方向のどちらのスケールもSIn関数を使って増減させていますが、Cos関数とかリニア関数などを使うと、また少し違ったアニメーションになるので、よければ試してみてください。

参考書籍