スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 物理エンジンFOAM

2007-11-09 | 20:32

物理エンジンFOAMの紹介
APEやFisixがどちらかといえばパーティクル系なのに対して、これは剛体系か?

デモが2種類公開されている

perpetualFall
さまざまな形状の物体が落ちてきて斜めの床をすべっている。重力や摩擦力を再現。

zeroGToyChest
こちらは床にさまざまな形状の物体が置いてあり、それを上から見た場合のシミュレーション。 物体をマウスで引っ張ったりできる。

まず zeroGToyChestを見てみる。これが拍子抜けするほど簡単。
少し単純化/変更して日本語のコメントを追加。
package 
{
    import flash.display.Sprite;
    import org.generalrelativity.foam.Foam;
    import org.generalrelativity.foam.dynamics.element.body.RigidBody;
    import org.generalrelativity.foam.util.ShapeUtil;
    import org.generalrelativity.foam.math.Vector;
    import org.generalrelativity.foam.dynamics.enum.Simplification;
    import org.generalrelativity.foam.dynamics.force.*;

    [SWF(width="400", height="300", backgroundColor="#ffffff")]
        public class Main extends Sprite
        {
            public function Main()
            {
                // FOAMエンジンの作成
                var foam:Foam = addChild( new Foam() ) as Foam;
                // 摩擦力の設定
                foam.addGlobalForceGenerator( new Friction( 0.15 ) );
                // 重力の設定
                foam.addGlobalForceGenerator( new Gravity( new Vector( 0, 5 ) ) );
                // マウスでドラッグできるようにする
                foam.useMouseDragger( true );

                // 剛体の作成
                var body:RigidBody = new RigidBody(10, 10, 50, ShapeUtil.createSymmetricPolygon( 5, 50 ) );
                var body2:RigidBody = new RigidBody( 100, 100, 50, ShapeUtil.createSymmetricPolygon( 6, 50 ) );
                // エンジンに剛体を追加
                foam.addElement( body );
                foam.addElement( body2 );

                // 壁を作る
                foam.addElement( new RigidBody( 0, 150, Simplification.INFINITE_MASS, ShapeUtil.createRectangle( 20, 300 ) ) ); //left
                foam.addElement( new RigidBody( 400, 150, Simplification.INFINITE_MASS, ShapeUtil.createRectangle( 20, 300 ) ) ); //right
                foam.addElement( new RigidBody( 200, 0, Simplification.INFINITE_MASS, ShapeUtil.createRectangle( 400, 20 ) ) ); //top
                foam.addElement( new RigidBody( 200, 300, Simplification.INFINITE_MASS, ShapeUtil.createRectangle( 400, 20 ) ) ); //bottom

                // シミュレーション開始
                foam.simulate();
            }
        }
}

実際の動作はこちら。(剛体はマウスで引っ張って移動可能)

シミュレーション的にどれほど正確なのかは不明
スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。