Time Tripper

Update : 2010/02/25


Flashで物理エンジン (bane)



Flashで物理エンジン(質点をダンパーで繋いだだけ)
【各頂点をマウスでドラッグ出来ます。空中で放すと落下、壁に押し付けると反発します。】

★遊び方★
ブランコのように加速するのを確かめよう。
三角形をバウンドさせた時の変形を確認しよう。
紐を持って振り回してみよう。
二重振り子はどう動くか確認しよう。
壁に押し付けてパッと放すと何処まで飛ぶか確認しよう。
紐を持ってクレーン遊びをしてみよう。
三角形の頂点を持って倒立バランスをとってみよう。


物理エンジンと大層なタイトルですが、やっていることは質点をバネのダンパーで接続し、重力加速だけで与えてシミュレーションしているだけです。
Flashレベルでは本格的なシミュレーションを行うには不可能ですが、この程度で十分遊べます。

まず質点ですが、言葉は難しそうですが実は簡単。単に運動ベクトルを持っている頂点です。
内容的には現在の座標値と移動ベクトルだけです。

これをバネのダンパーで接続するのですが、これも単純です。
まず各頂点の接続マップを用意し、その各頂点の初期距離を計測し記録します。
各頂点は思い思いに移動しようとしますが、この接続により各頂点の距離を計測し、出来るだけ初期距離になるよう強制してあげます。
これによって初期の形状をある程度維持するだけです。

例題では三角形状に置かれた各頂点とそれに接続する紐状の各点を接続マップで結んでいます。
初期距離は接続マップにより自動計測され記録されます。
後は各頂点に重力加速を各頂点の移動ベクトルに加算するだけです。(例題ではY軸に定数を単純加算)
その後形状を維持するために各頂点の距離を接続マップにしたがって計測し直し、差分の一部を移動ベクトルに加算します。
基本はこれだけです。

ここで重要なのは、各移動ベクトルに差分の一部を加算するところです。
各頂点は、既に移動していますのでそれを置換えることは出来ません。
よって次回以降に少しでも元の形状に近づけるため、少し補正してあげると言うことになります。
これがバンパープログラムです。

これは自然的なプログラムでもあり、剛体的な発想ではなく柔軟なプログラムとも言えます。
自然界では全てのものが柔軟で伸びたり縮んだりしています。全くの剛体など存在しないはずです。(分子レベルでは)
このブログラムではそれが極端に表現されていますが、かえって現象を解りやすく理解できるかと思います。
これを少し剛体に近づけるとすると、バネの強度を増せば良いかと思います。
これは単純にバンパーロジックを数回ループさせると効果的です。

このプログラムでは各質点の重力加速は一定になっていますが、別に質点マップを持てば重さの違う質点も簡単に表現できます。
バランスゲームなんかには使えるかもしれません。
もう少し高度に各線分との当り判断や接触時の摩擦係数を付加するとより現実的な動きになるかと思います。
まーゲームレベルでは何に使うかにより面白さも変わりますので、現状は実装していません。
(接続するバンパー距離を動的に変更することでアクチュエーターを作り、歩行ロボットなども簡単に作れます)

このプログラムは非常に簡単で基本的なものですが、ゲームなどのプログラムに使うと面白い効果があると思いますのでお試しください。


【参考】

APE - Actionscript Physics Engine
http://www.cove.org/ape/index.htm

Fisix Engine
http://www.fisixengine.com/engine.asp

TRAER.PHYSICS
http://www.cs.princeton.edu/%7Etraer/physics/

sodaplay
http://www.sodaplay.com/