首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

物理模拟发动机box2D-1

2012-10-06 
物理模拟引擎box2D-1几个常用的概念 rigid body shapeconstraintcontact constraint jointjoint limitjoin

物理模拟引擎box2D-1
几个常用的概念
rigid body
shape 
constraint 
contact constraint
joint 
joint limit 
joint motor
world 
Hello Box2D
Creating a World

var worldAABB:b2AABB = new b2AABB();  worldAABB.lowerBound.Set(-100.0, -100.0);  worldAABB.upperBound.Set(100.0, 100.0);




Caution
The world AABB should always be bigger then the region where your bodies are located. It is better to make the world AABB too big than too small. If a body reaches the boundary of the world AABB it will be frozen and will stop simulating.
and b2 allow object to sleep.

var gravity:b2Vec2 = new b2Vec2 (0.0, -10.0);  var doSleep:Boolean = true; 


now  we create world object.

var world:b2World = new b2World(worldAABB, gravity, doSleep);



we can following the steps as
Creating a World--Creating a Ground Box--Creating a Dynamic Body--
Simulating the World (of Box2D). the following is source code and the attacted is flash.

package{              import flash.display.Sprite;       import flash.events.Event;       // Classes used in this example       import Box2D.Dynamics.*;       import Box2D.Collision.*;       import Box2D.Collision.Shapes.*;       import Box2D.Common.Math.*;         [SWF(width="640", height="360", backgroundColor="#000000", frameRate="30")]                   public class HelloWorld extends Sprite{                      [Embed(source='assets/PhysBox.swf')]              public var PhysBox:Class;              //public var FGmc:MovieClip = new FG as MovieClip;                       [Embed(source='assets/PhysCircle.swf')]              public var PhysCircle:Class;                       [Embed(source='assets/PhysGround.swf')]              public var PhysGround:Class;                       public function HelloWorld(){                                                            // Add event for main loop               addEventListener(Event.ENTER_FRAME, Update, false, 0, true);                                                            // Creat world AABB               var worldAABB:b2AABB = new b2AABB();               worldAABB.lowerBound.Set(-100.0, -100.0);               worldAABB.upperBound.Set(100.0, 100.0);                              // Define the gravity vector               var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);                              // Allow bodies to sleep               var doSleep:Boolean = true;                              // Construct a world object               m_world = new b2World(worldAABB, gravity, doSleep);                              // set debug draw               /*var dbgDraw:b2DebugDraw = new b2DebugDraw();              var dbgSprite:Sprite = new Sprite();              addChild(dbgSprite);              dbgDraw.m_sprite = dbgSprite;              dbgDraw.m_drawScale = 30.0;              dbgDraw.m_fillAlpha = 0.0;              dbgDraw.m_lineThickness = 1.0;              dbgDraw.m_drawFlags = 0xFFFFFFFF;              m_world.SetDebugDraw(dbgDraw);*/                                                           // Vars used to create bodies               var body:b2Body;               var bodyDef:b2BodyDef;               var boxDef:b2PolygonDef;               var circleDef:b2CircleDef;                                                            // Add ground body               bodyDef = new b2BodyDef();               //bodyDef.position.Set(15, 19);               bodyDef.position.Set(10, 12);               //bodyDef.angle = 0.1;               boxDef = new b2PolygonDef();               boxDef.SetAsBox(30, 3);               boxDef.friction = 0.3;               boxDef.density = 0; // static bodies require zero density               /*circleDef = new b2CircleDef();              circleDef.radius = 10;              circleDef.restitution = 0.2*/              // Add sprite to body userData               bodyDef.userData = new PhysGround();               //bodyDef.userData = new PhysCircle();               bodyDef.userData.width = 30 * 2 * 30;                bodyDef.userData.height = 30 * 2 * 3;                addChild(bodyDef.userData);               body = m_world.CreateBody(bodyDef);               body.CreateShape(boxDef);               //body.CreateShape(circleDef);               body.SetMassFromShapes();                              // Add some objects               for (var i:int = 1; i < 10; i++){                   bodyDef = new b2BodyDef();                   bodyDef.position.x = Math.random() * 15 + 5;                   bodyDef.position.y = Math.random() * 10;                   var rX:Number = Math.random() + 0.5;                   var rY:Number = Math.random() + 0.5;                   // Box                   if (Math.random() < 0.5){                       boxDef = new b2PolygonDef();                       boxDef.SetAsBox(rX, rY);                       boxDef.density = 1.0;                       boxDef.friction = 0.5;                       boxDef.restitution = 0.2;                       bodyDef.userData = new PhysBox();                       bodyDef.userData.width = rX * 2 * 30;                        bodyDef.userData.height = rY * 2 * 30;                        body = m_world.CreateBody(bodyDef);                       body.CreateShape(boxDef);                   }                    // Circle                   else {                       circleDef = new b2CircleDef();                       circleDef.radius = rX;                       circleDef.density = 1.0;                       circleDef.friction = 0.5;                       circleDef.restitution = 0.2                      bodyDef.userData = new PhysCircle();                       bodyDef.userData.width = rX * 2 * 30;                        bodyDef.userData.height = rX * 2 * 30;                        body = m_world.CreateBody(bodyDef);                       body.CreateShape(circleDef);                   }                   body.SetMassFromShapes();                   addChild(bodyDef.userData);               }                          }                      public function Update(e:Event):void{                              m_world.Step(m_timeStep, m_iterations);                              // Go through body list and update sprite positions/rotations               for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){                   if (bb.m_userData is Sprite){                       bb.m_userData.x = bb.GetPosition().x * 30;                       bb.m_userData.y = bb.GetPosition().y * 30;                       bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);                   }               }                          }                      public var m_world:b2World;           public var m_iterations:int = 10;           public var m_timeStep:Number = 1.0/30.0;                  }     } 

热点排行