jiglib 3D Physics Engine #1

3ヶ月以上空いてしまいました。

jiglib 3D Physics Engineという各種3Dライブラリで物理シミュレーションを行うことができるライブラリを触ってみました。

対応している3Dライブラリはjiglibのバージョンr92の時点でPapervision3D・Away3D・Sandyの3つ。

自分はPV3Dしか使ったことないのでPV3D+jiglibの環境です。

ご覧になるには最新のFlashPlayerが必要です。

package
{
	import flash.events.Event;

	import org.papervision3d.view.BasicView;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.DisplayObject3D;

	import jiglib.plugin.papervision3d.Papervision3DPhysics;
	import jiglib.physics.RigidBody;

	import net.hires.debug.Stats;

	/**
	 * @author laqu
	 */
	public class Main extends BasicView
	{
		private var rootNode:DisplayObject3D;
		private var physics:Papervision3DPhysics;
		private var floor:RigidBody;

		public static const CUBE_SIZE:uint=150;
		public static const CUBE_NUM:uint=15;

		//Constructor
		public function Main():void
		{
			super(450,300,false);
			stage.quality="low";
			init();
		}

		private function init() : void
		{
			addChild(new Stats());

			rootNode=new DisplayObject3D();
			scene.addChild(rootNode);

			camera.y=400;
			camera.z=-2000;

			physics=new Papervision3DPhysics(rootNode,9.8);

			//Create Floor
			floor=physics.createGround(new WireframeMaterial(0), 2000, 0);
			floor.y=-500;

			//Create Cubes
			for(var i:uint=0;i < Main.CUBE_NUM;i++)
			{
				var matlist:MaterialsList=new MaterialsList();
				matlist.addMaterial(new WireframeMaterial(Math.random()*0xffffff),"all");
				var cube:RigidBody=physics.createCube(matlist, Main.CUBE_SIZE, Main.CUBE_SIZE, Main.CUBE_SIZE);
				cube.restitution=1.2;
				cube.friction=0.2;
				cube.y = Main.CUBE_SIZE * i+1000;
			}

			//Rendering Start
			startRendering();
		}

		protected override function onRenderTick(e:Event=null) : void
		{
			rootNode.rotationY+=(stage.stageWidth/2-stage.mouseX)/70;
			physics.step();
			super.onRenderTick(e);
		}
	}
}

以下ソースです。
PV3Dを使用する場合はPapervision3DPhysicsクラスでまず物理のワールドを作ります。

physics=new Papervision3DPhysics(rootNode,9.8);

第1引数はDisplayObjectContainer3Dなのでsceneでもいいんですが、別途事前にDisplayObject3Dを作っておいてそれを割り当てておきます。
第2引数は重力です。

続いて地面を作ります。使うクラスはRigidBodyというクラス。
Papervision3DPhysicsにはcreateGround・createCube・createSphereというメソッドが用意されておりそれらを利用し3Dのオブジェクトを作っていきます。(PV3Dでオブジェクトを作っておいてそれを利用することもできるのですが、それはまた今度)

floor=physics.createGround(new WireframeMaterial(0), 2000, 0);

第2引数はサイズなんですがそれはあくまで第1引数で指定したマテリアルが表示されるサイズであって地面は延々と続いています、はず。

次にオブジェクトを作ってみます。

var cube:RigidBody=physics.createCube(matlist, Main.CUBE_SIZE, Main.CUBE_SIZE, Main.CUBE_SIZE);

最後にenterFrame内でPapervision3DPhysicsのstepメソッドを実行します。
これ忘れると動かない。

physics.step();

Tags: , , , ,

Similar Posts

Leave a Reply