box2d学习
来源:互联网 发布:知止什么意思 编辑:程序博客网 时间:2024/04/28 11:40
Box2D学习笔记
Box2D是一个用于游戏的2D刚体仿真库,程序员可以在他们的游戏里使用他们,也可以是的自己的物体运动的更可信。让他看起来更加接近现实。物理引擎是一个程序性的动画系统。而不是由动画师去移动物体。这一切都是建立在牛顿力学的基础之上。
Box2D最初是用c++来写的,之后有被多种语言所实现。
Box2D Physics Engine
Box2d中的核心概念:
刚体:和我们在物理中学习的刚体的概念是一样的,两物体之间的距离都是完全不会变化的。不会发生变形。他就是Box2D中的body。
形状:一个依附于body的几何结构体,同时具有物理的摩擦(friction)和恢复(restitution)的材料性质。
约束:就是我们所熟悉的自由度
世界:我们所处的真实的世界,包括物体和相互的作用
每个Box2D程序都将从一个世界对象的创建开始。他是管理对象以及模拟的中心。
private function initWorld():void { //定义世界包围盒 var worldAABB:b2AABB=new b2AABB(); worldAABB.lowerBound.Set(-100,-100); worldAABB.upperBound.Set(600,600); //定义重力 var gravity:b2Vec2=new b2Vec2(0,-10); //定义允许物体休眠 var doSleep:Boolean=true; this.world=new b2World(worldAABB,gravity,doSleep); }
创建世界对象b2World,
(1)首先应当创建包围和盒对象b2AABB。他的大小是越大越好。
因为当刚体碰到包围盒的边缘的时候他会停止模拟。
(2)创建世界中的重力场。他是一个2维的适量b2Vec2。
(3)当物体停止移动的时候,让物体停止模拟。节约资源doSleep。
以上这3个的确定都是初始化world对象所必须的。到此就创建了一个有一定的大小以及一定的重力场的空间,有了就可以往里面装东西了。
创建刚体b2Body,
(1)刚体的是由世界对象来创建的
var body:b2Body=this.world.CreateBody(bodyDef);
其中的参数bodyDef是b2BodyDef创建的,是对body的defination.
var bodyDef:b2BodyDef=new b2BodyDef();bodyDef.position.Set(0,4);
他主要是用于初始化刚体在世界空间里的一些属性。包括位置(position)、质量(mass)、旋转角度(angle)等。
现在我们已经创建了一个刚体,并确定了他在世界空间当中的位置。物体到底是什么样的,以及他的物理属性怎么样是我么马上就要创建的。
(2)给物体定义形状以及物理材质
body.CreateShape(shapeDef);
其中的初始参数shapeDef是b2ShapeDef
var shapeDef:b2PolygonDef=new b2PolygonDef();//定义形状为多边形2shapeDef.SetAsBox(3,3);//将多边形设为矩形3shapeDef.density=1.0;//定义密度4shapeDef.friction=0.3;//定义摩擦力
b2PolygonDef是继承自b2ShapeDef
public class b2PolygonDef extends b2ShapeDef
除了b2PolygonDef外还有b2CircleDef。
到现在我们的刚体依然是没的外观的,对其定义的shapeDef也只是对其封装了一些特殊的属性而已。
实际上定义刚体外观的是bodyDef(shapeDef也有这个属性)的userDate属性,他是*类型的。任何类型的对象都可以给他。我们现在需要用它来定义外观(形状)就将形状类或影片类的引用传给他就可以了。同时需要将userData加入到舞台的显示列表当中。
bodyDef.userData = new PhysCircle();bodyDef.userData.width = rX * 2 * 30; bodyDef.userData.height = rX * 2 * 30;
其中的physCircle是sharp类的自定义类。
来自官方的helloWorld源码:
1 package Application 2{ 3 4 import flash.display.Sprite; 5 import flash.events.Event; 6 // Classes used in this example 7 import Box2D.Dynamics.*; 8 import Box2D.Collision.*; 9 import Box2D.Collision.Shapes.*; 10 import Box2D.Common.Math.*; 11 12 public class HelloWorld extends Sprite{ 13 14 public function HelloWorld(){ 15 16 17 18 // Add event for main loop 19 addEventListener(Event.ENTER_FRAME, Update, false, 0, true); 20 21 22 23 // Creat world AABB 24 var worldAABB:b2AABB = new b2AABB(); 25 worldAABB.lowerBound.Set(-100.0, -100.0); 26 worldAABB.upperBound.Set(100.0, 100.0); 27 28 // Define the gravity vector 29 var gravity:b2Vec2 = new b2Vec2(0.0, 10.0); 30 31 // Allow bodies to sleep 32 var doSleep:Boolean = true; 33 34 // Construct a world object 35 m_world = new b2World(worldAABB, gravity, doSleep); 36 37 // set debug draw 38 /*var dbgDraw:b2DebugDraw = new b2DebugDraw(); 39 var dbgSprite:Sprite = new Sprite(); 40 addChild(dbgSprite); 41 dbgDraw.m_sprite = dbgSprite; 42 dbgDraw.m_drawScale = 30.0; 43 dbgDraw.m_fillAlpha = 0.0; 44 dbgDraw.m_lineThickness = 1.0; 45 dbgDraw.m_drawFlags = 0xFFFFFFFF; 46 m_world.SetDebugDraw(dbgDraw);*/ 47 48 49 50 // Vars used to create bodies 51 var body:b2Body; 52 var bodyDef:b2BodyDef; 53 var boxDef:b2PolygonDef; 54 var circleDef:b2CircleDef; 55 56 57 58 // Add ground body 59 bodyDef = new b2BodyDef(); 60 //bodyDef.position.Set(15, 19); 61 bodyDef.position.Set(10, 12); 62 //bodyDef.angle = 0.1; 63 boxDef = new b2PolygonDef(); 64 boxDef.SetAsBox(30, 3); 65 boxDef.friction = 0.3; 66 boxDef.density = 0; // static bodies require zero density 67 /*circleDef = new b2CircleDef(); 68 circleDef.radius = 10; 69 circleDef.restitution = 0.2*/ 70 // Add sprite to body userData 71 bodyDef.userData = new PhysGround(); 72 //bodyDef.userData = new PhysCircle(); 73 bodyDef.userData.width = 30 * 2 * 30; 74 bodyDef.userData.height = 30 * 2 * 3; 75 addChild(bodyDef.userData); 76 body = m_world.CreateBody(bodyDef); 77 body.CreateShape(boxDef); 78 //body.CreateShape(circleDef); 79 body.SetMassFromShapes(); 80 81 // Add some objects 82 for (var i:int = 1; i < 10; i++){ 83 bodyDef = new b2BodyDef(); 84 bodyDef.position.x = Math.random() * 15 + 5; 85 bodyDef.position.y = Math.random() * 10; 86 var rX:Number = Math.random() + 0.5; 87 var rY:Number = Math.random() + 0.5; 88 // Box 89 if (Math.random() < 0.5){ 90 boxDef = new b2PolygonDef(); 91 boxDef.SetAsBox(rX, rY); 92 boxDef.density = 1.0; 93 boxDef.friction = 0.5; 94 boxDef.restitution = 0.2; 95 bodyDef.userData = new PhysBox(); 96 bodyDef.userData.width = rX * 2 * 30; 97 bodyDef.userData.height = rY * 2 * 30; 98 body = m_world.CreateBody(bodyDef); 99 body.CreateShape(boxDef);100 } 101 // Circle102 else {103 circleDef = new b2CircleDef();104 circleDef.radius = rX;105 circleDef.density = 1.0;106 circleDef.friction = 0.5;107 circleDef.restitution = 0.2108 bodyDef.userData = new PhysCircle();109 bodyDef.userData.width = rX * 2 * 30; 110 bodyDef.userData.height = rX * 2 * 30; 111 body = m_world.CreateBody(bodyDef);112 body.CreateShape(circleDef);113 }114 body.SetMassFromShapes();115 addChild(bodyDef.userData);116 }117 118 }119 120 public function Update(e:Event):void{121 122 m_world.Step(m_timeStep, m_iterations);123 124 // Go through body list and update sprite positions/rotations125 for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){126 if (bb.m_userData is Sprite){127 bb.m_userData.x = bb.GetPosition().x * 30;128 bb.m_userData.y = bb.GetPosition().y * 30;129 bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);130 }131 }132 133 }134 135 public var m_world:b2World;136 public var m_iterations:int = 10;137 public var m_timeStep:Number = 1.0/30.0;138 139 }140141}
其中的userData的对象都是在flash中定义影片剪辑导出类。
- BOX2D学习
- box2d学习
- Box2d源码学习<一>之Box2d简介
- Box2d源码学习<一>之Box2d简介
- Box2d学习(一)之Box2d初解
- Box2d源码学习<一>之Box2d简介
- box2d物理引擎学习
- Box2d学习资源
- box2d 学习笔记
- box2d学习总结
- box2d-x学习经历
- cocos2dx Box2d 学习
- box2d 如何学习?
- box2d学习笔记
- Box2D个人学习笔记 - 介绍
- Box2D个人学习笔记 - HelloWorld
- box2d 基于testbed的学习
- Box2D基本概念的学习记录
- 网络推广并不是渠道越多越好而要精细
- 伺服电机和步进电机的区别
- fimc0 fimc1 fimc2之间的关系
- Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍
- [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter 解决
- box2d学习
- 通讯录见解
- 第八周——课本例题的熟悉。
- 《步步惊情》曝忘情激吻照 吴奇隆刘诗诗秀甜蜜
- 回调函数的作用
- mac下如何连接小米
- java-spring与mongodb的整合方式一 自动注入xml
- 实现复数类中的运算符重载
- 数据库有数据,但hibernate返回null