版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Box2D物理碰撞基础知识,Box2D,Author : Blog : Games Home : QQ :871826122 E-mail : Company : Website :,Box2D物理碰撞基础知识,Box2D简介,Box2D是一个用于游戏的2D刚体仿真库。它可以使游戏中物体的运动更加逼真。 Box2d有C+,flash和Java等版本。 Box2D会自动管理各个物体的碰撞,弹跳等物理状态,我们只需要创建各种刚体。创建刚体可以通过b2BodyDef.userData来创建。b2Shape.SetAsBox(width,height)指的是物体的半宽和半高,所以在计算时都要乘以2。由
2、于Box2D本身的限制,运算时要进行长度换算。,Box2D物理碰撞基础知识,Box2D核心概念,刚体(rigid body) 一块十分坚硬的物质,它上面的任何两点之间的距离都是完 全不变的。它们就像钻石那样坚硬。 形状(shape) 一块严格依附于物体(body)的 2D 碰撞几何结构(collisiong eometry)。形状具有摩擦(friction)和恢 复(restitution)的材料性 质。 约束(constraint) 一个约束(constraint)就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我 们把一个物体钉在墙上,Box2D物理碰撞基础知识,
3、(像摆 那样) ,那我们就把它约束到了墙上。这样,此物体就 只能绕着这个钉子旋 转,所以这个约束消除了它 2 个自由度。 接触约束(contact constraint) 一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复 (restitution)的特殊约束。你永远都不必创建 一个接触约束, 它们会自动被 Box2D 创建。 关节(joint) 它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等 等。关节可以支持 限制(limits)和马达(motors)。 关节限制(joint limit) 一个关节限制(joint limit)限定了
4、一个关节的运动范围。例如 人类的胳膊肘只能做某一范围角度的运 动。,Box2D物理碰撞基础知识,关节马达(joint motor) 一个关节马达能依照关节的自由度来驱动所连接的物体。例 如,你可以使用一个马达来驱动一个肘的旋转。 世界(world) 一个物理世界就是物体,形状和约束相互作用的集合。 Box2D 支持创建多个世界,但这通常是不必要 的。 积分器(integrator) 积分器在离散的时间点上模拟物理方程,它将 与游戏动画循 环一同运行。通常来说游戏物理引擎需要至少 60Hz 的速度, 也就是 1/60 的时间步。 约束求解器(constraint solver) 约束求解器用于解
5、决模拟中的所有 约束,一次一个。要得到 良好的解,需要迭代所有约束多次。建议的 Box2D 迭代次数 是 10 次。,Box2D物理碰撞基础知识,Box2D注意事项,全局的对象的构造函数作了三件事情: 1、一个在b2AABB类中的实例构建的坐标系统 2、一个定义重力的向量,这是一个b2Vec2类构建的实例。 3、一个布尔变量来定义对象是否沉迷。(如果你设置为true,对象将会沉迷)。 4、执行Step()函数,每一帧都会更新所有的Body在world中的位置。 5、Box2D中的单位为米,30像素=1米。所以在box2D中经常会看到 坐标点乘以30,这样就不奇怪为什么用30而不是15或者20的
6、了。,Box2D物理碰撞基础知识,Box2D Body,创建好World后,可以向World内部添加任何球体或者盒子,以 及你想到的任何形状的东西,那我就需要定义一个Body。 一个body体大概需要做2-4件事情: 1、定义一个形状 2、一个(x,y)的位置 3、角度 4、一个预制的Sprite对象 其中3、4是可选操作。这里我可能不会讲到Box2D内设的一些画 图类库,因为我们在实际的操作中,可能用的都是自定义的。内设 的类库一般用来模拟比较好,进行实际开发可能不适合,所以大家 有想研究内设画图类库的可能需要自己去研究一下了。,Box2D物理碰撞基础知识,Box2D b2ShapeDef,
7、如果你想在你的游戏或者其他的什么中具有一些有特色的东西, 你可以通过综合形状定义Body来制作一个Sprite。形状的定义,有3 种类型的形状定义,他们都是扩展的b2ShapeDef基类。 b2BoxDef类具有4个重要的属性: 1、SetAsBox(设定边框):这是一个向量,本质上说他就是一个形状的 中心坐标 2、Density(密度):在碰撞的等式中使用密度*面积=质量,密度如果是0或者null,将会是一个静止的对象。 3、Friction(摩擦力):这用来计算两个对象之间的摩擦,可以在0.0-1.0之间调整它们。 4、Restitution(弹性):这是调整对象弹性程度的属性,可以在0.
8、0-1.0之间调整它们。,Box2D物理碰撞基础知识,b2CircleDef类中有一个不同的属性,代替SetAsBox是他的Radius( 半径)。 b2PolyDef类具有一个顶点数组(最大是8)来代替SetAsBox和 Radius。这些顶点都是b2Vec2类型的对象。 以下通过实例来讲述Box2D的基本用法,在打开源文件进行测试时, 需要把Box2D的类库放在目录下面,程序才能正常运行。,Box2D物理碰撞基础知识,Box2D Hello World,Hello World实例中会讲述Box2D 的基础用法。 1、准备好Box2D类库 2、在画自己的形状时,如果不想自己给自己添乱,定义的
9、形状width或者height尽量都能被30整除,这样便于我们的计算 3、按前面的讲述,我们需要创建的全局变量里面要有一个World, 记分器、约束求解器。同样还要准备一个盒子(b2AABB)、重力(gravity)、是否能睡眠(doSleep) 4、添加形状需要用到b2Body、b2BodyDef、b2PolygonDef(多边形)、b2CircleDef(圆形)这几个常用的类。 Hello World里面的难点应该就是第4点,希望大家能注意一下, 如果自己做例子时Rect与Circle应该怎样添加。例子中创建了静态地 面与动态的物体。upData函数让整个世界运转起来,你可能不需要 知道f
10、or循环里面到底是怎么运作的,只需要知道这个for循环让这 个对象开始在世界中进行模拟就可以了(这个for循环是必须的)。,Box2D物理碰撞基础知识,Box2D 鼠标与刚体交互之移除选中刚体,此示例在Hello World的基础之上进行扩展,关键操作为 getBodyAtMouse()函数,早起看过C+版本而写的此函数。现在网络 上可能也能搜到类似的,但是都讲的不是很详细。不过这个函数你 有可能不需要到底是怎样运行,仅仅知道这个函数返回与鼠标点相 交的刚体就可以了。下面解释一下getBodyAtMouse()函数的机制: 当鼠标点击时,得到当前鼠标的坐标点,在此鼠标点产生一个 很小的刚体,半
11、径在0.001内就有效,然后遍历整个世界内部与小 刚体产生碰撞的刚体,最后返回碰撞的刚体。返回的刚体都是唯一 的,说唯一是因为世界内部的对象都是刚体,既然是刚体,就不会 产生两个刚体重叠或者相交的情况,所以大家不要感到我说的唯一 很奇怪。,Box2D物理碰撞基础知识,Box2D 鼠标与刚体交互之拖拽刚体,由于Box2D是不直接与鼠标交互的,而是通过鼠标关节 b2MouseJoint交互的。 交互的过程由四个步骤完成: 第一步:获取鼠标单击处的刚体。 第二步:创建鼠标关节。 第三步:控制鼠标关节。 第四步:销毁鼠标关节。 获取刚体: public function getBodyAtMouse(
12、world:b2World,stage:Stage,includeStatic:Boolean=true):b2Body var mouseb2Vec:b2Vec2 = new b2Vec2(stage.mouseX / 30, stage.mouseY / 30); var aabb:b2AABB = new b2AABB(); aabb.lowerBound.Set(mouseb2Vec.x - 0.001, mouseb2Vec.y - 0.001); aabb.upperBound.Set(mouseb2Vec.x + 0.001, mouseb2Vec.y + 0.001); var
13、 maxCount:int = 10;,Box2D物理碰撞基础知识,var shapesArray:Array = new Array(); var count:int = world.Query(aabb, shapesArray, maxCount); var body:b2Body; for (var i:int = 0; i count;i+ ) if (!shapesArrayi.m_body.IsStatic()|includeStatic) var tShape:b2Shape = shapesArrayi as b2Shape; var inside:Boolean = tSh
14、ape.TestPoint(tShape.m_body.GetXForm(), mouseb2Vec); if (inside) body = tShape.m_body; break; return body; ,Box2D物理碰撞基础知识,创建关节: var lbf_tempBody:b2Body = getBodyAtMouse(lbf_world, stage); if (lbf_tempBody) /设置关节 var lbf_mouseJointDef:b2MouseJointDef = new b2MouseJointDef(); / 设置body1为无碰撞检测形状的静态刚体 lb
15、f_mouseJointDef.body1 = lbf_world.GetGroundBody(); / 设置body2为当前被检测到被点击的刚体 lbf_mouseJointDef.body2 = lbf_tempBody; / 设置鼠标关节的目标位置 lbf_mouseJointDef.target.Set(mouseX / 30, mouseY / 30); / 设置鼠标关节的力度 lbf_mouseJointDef.maxForce = 10000; / 设置鼠标关节的时间步 lbf_mouseJointDef.timeStep = lbf_timeStep; / 在世界中创建这个b2
16、MouseJoint对象 lbf_mouseJoint = lbf_world.CreateJoint(lbf_mouseJointDef) as b2MouseJoint lbf_mouseJointDef = null; lbf_tempBody = null; ,Box2D物理碰撞基础知识,控制关节: /控制鼠标关节很简单,就是在帧循环时间中不断更新鼠标关节的目标位置。 if (lbf_mouseJoint) lbf_mouseJoint.SetTarget(new b2Vec2(mouseX / 30, mouseY / 30); 销毁关节: if (lbf_mouseJoint) l
17、bf_world.DestroyJoint(lbf_mouseJoint); lbf_mouseJoint = null; 具体细节请详看: Box2D 鼠标与刚体交互之拖拽刚体,Box2D物理碰撞基础知识,Box2D 键盘事件,在Box2D中,刚体不仅会受到重力、碰撞等影响,而且也可以施加一个力对它 造成影响。 可以通过至少以下这几个方法去移动一个刚体: public function ApplyForce(force:b2Vec2, point:b2Vec2) : void 向目标(世界位置)施加一个力,如果这个力不是施加在刚体的质心,它将产生 一个扭矩并影响其角速度,在此之前,它将自动唤醒刚体。 力的单位为N。(1N=1kg*m/s2) public function ApplyImpulse(impulse:b2Vec2, point:b2Vec2) : void 向目标(世界位置)施加一个冲量,它将立刻改变刚体的速度,如果这个力不是 施加在刚体的质心,它将影响其角速度,在此之前,它将自动唤醒刚体。 冲量的单位为kg * m/s 或 N*s。 public function SetLinearVelocity(v:b2Vec2) : void 直接设置质心线速度,需要注意的是它是不会自动唤醒刚体的,所以你必须事先 唤醒施加对象再设置质心
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 免烧砖施工方案(3篇)
- 内部口碑营销方案(3篇)
- 制作标牌施工方案(3篇)
- 卖菜充值营销方案(3篇)
- 古风夜市活动策划方案(3篇)
- 商品受损应急预案(3篇)
- 土墙改造施工方案(3篇)
- 基座如何施工方案(3篇)
- 大厦防盗应急预案(3篇)
- 婚庆论坛活动策划方案(3篇)
- 小儿药液外渗的预防及护理
- DB32-T 4787-2024 城镇户外广告和店招标牌设施设置技术标准
- AQ/T 1119-2023 煤矿井下人员定位系统通 用技术条件(正式版)
- 2024年厦门航空有限公司招聘笔试参考题库含答案解析
- 林城镇卫生院安全生产制度
- 南京航空航天大学“天目启航”学生自由探索项目申请书
- EIM Starter Unit 6 This is delicious单元知识听写单
- 陕西铜川声威特种水泥有限公司2500t-d新型干法特种水泥熟料技改生产线项目环评报告
- GB/T 4062-2013三氧化二锑
- GB/T 26746-2011矿物棉喷涂绝热层
- GB 30616-2020食品安全国家标准食品用香精
评论
0/150
提交评论