package { import Box2D.Collision.Shapes.b2PolygonDef; import Box2D.Collision.b2AABB; import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2World;
import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event;
import org.papervision3d.cameras.Camera3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D;
[SWF(backgroundColor="#ffffff")]
public class Box2D_PV3D1 extends Sprite { // PV3D用基本変数 private var viewport:Viewport3D; private var scene:Scene3D; private var camera:Camera3D; private var renderer:BasicRenderEngine; private var rootNode:DisplayObject3D;
// Box2D用基本変数 private var m_world:b2World; private var m_iterations:int; private var m_timeStep:Number; private var m_physScale:Number;
// Box用変数 private var BoxBodyArray:Array=new Array(); private var boxN:int=30;
// 床用変数 private var floorBody1:b2Body; private var floor:Cube;
// コンストラクタ public function Box2D_PV3D1() { // 全体の初期設定 stage.frameRate=60; stage.quality=StageQuality.MEDIUM; stage.scaleMode=StageScaleMode.NO_SCALE; stage.align=StageAlign.TOP_LEFT;
// PV3Dの初期設定 viewport=new Viewport3D(0, 0, true, true); scene=new Scene3D(); camera=new Camera3D(); renderer=new BasicRenderEngine(); rootNode=scene.addChild(new DisplayObject3D("rootNode")); camera.zoom=30; camera.focus=30; camera.x=-400; camera.y=400; camera.target=DisplayObject3D.ZERO; addChild(viewport); addEventListener(Event.ENTER_FRAME, onFrame);
// Box2Dの初期設定 m_iterations=30; m_timeStep=1 / 60; m_physScale=30; var worldAABB:b2AABB=new b2AABB; worldAABB.lowerBound.Set(-1000.0, -1000.0); worldAABB.upperBound.Set(1000.0, 1000.0); var gravity:b2Vec2=new b2Vec2(0.0, 10.0); var doSleep:Boolean=true; m_world=new b2World(worldAABB, gravity, doSleep);
// Box2Dの床の設定 var floorDef1:b2PolygonDef=new b2PolygonDef; floorDef1.SetAsBox(500 / m_physScale, 5 / m_physScale); floorDef1.density=1000.0; floorDef1.friction=1.0; var floorBD1:b2BodyDef=new b2BodyDef; floorBD1.position.Set(250 / m_physScale, 500 / m_physScale); floorBody1=m_world.CreateStaticBody(floorBD1); floorBody1.CreateShape(floorDef1); floorBody1.SetMassFromShapes();
// PV3Dの床の設定 var boxcolor:Array=new Array(); for(var i:int=0; i < 6; i++) { boxcolor[i]=new ColorMaterial(Math.floor(Math.random() * 0xFFFFFF), 0.6); } var materials:MaterialsList=new MaterialsList({front:boxcolor[0], back:boxcolor[1], right:boxcolor[2], left:boxcolor[3], top:boxcolor[4], bottom:boxcolor[5]}); floor=new Cube(materials, 1000, 100, 10, 4, 4); rootNode.addChild(floor);
// Box2DのCubeの設定 for(var i:int=0; i < boxN; i++) { var BoxDef1:b2PolygonDef=new b2PolygonDef; BoxDef1.SetAsBox(20 / m_physScale, 20 / m_physScale); BoxDef1.density=1.0; BoxDef1.friction=1.0; BoxDef1.restitution=0.3; var BoxBD1:b2BodyDef=new b2BodyDef; BoxBD1.position.Set(Math.random() * 600 / m_physScale, Math.random() * 300 / m_physScale); var BoxBody1:b2Body=m_world.CreateDynamicBody(BoxBD1); BoxBody1.CreateShape(BoxDef1); BoxBody1.SetMassFromShapes();
BoxBodyArray[i]=BoxBody1; }
// PV3DのCubeの設定 for(var i:int=0; i < boxN; i++) { boxcolor=new Array(); for(var j:int=0; j < 6; j++) { boxcolor[j]=new ColorMaterial(Math.floor(Math.random() * 0xFFFFFF), 0.6); } materials=new MaterialsList({front:boxcolor[0], back:boxcolor[1], right:boxcolor[2], left:boxcolor[3], top:boxcolor[4], bottom:boxcolor[5]}); var cube:Cube=new Cube(materials, 40, 40, 40, 4, 4); rootNode.addChild(cube, "cube" + i.toString()); } }
// レンダリング用関数 public function onFrame(e:Event):void { m_world.Step(m_timeStep, m_iterations); for(var bb:b2Body=m_world.m_bodyList; bb; bb=bb.m_next) { if (bb == floorBody1) { floor.x=(bb.GetPosition().x) * m_physScale - 200; floor.y=-(bb.GetPosition().y) * m_physScale + 300; floor.rotationZ=-bb.GetAngle() * (180 / Math.PI); } for(var i:int=0; i < boxN; i++) { var boxboy:b2Body=BoxBodyArray[i]as b2Body; if (bb == boxboy) { var cube:Cube=rootNode.getChildByName("cube" + i.toString())as Cube; cube.x=(bb.GetPosition().x) * m_physScale - 200; cube.y=-(bb.GetPosition().y) * m_physScale + 300; cube.rotationZ=-bb.GetAngle() * (180 / Math.PI); break; } } } renderer.renderScene(scene, camera, viewport); } } } |
コメント