




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Box2D 主讲人 Box2D简介 Box2D是一个用于游戏的2D刚体仿真库 它可以使游戏中物体的运动更加逼真 Box2d有C flash和Java等版本 Box2D会自动管理各个物体的碰撞 弹跳等物理状态 我们只需要创建各种刚体 创建刚体可以通过b2BodyDef userData来创建 b2Shape SetAsBox width height 指的是物体的半宽和半高 所以在计算时都要乘以2 由于Box2D本身的限制 运算时要进行长度换算 Box2D核心概念 刚体 rigidbody 一块十分坚硬的物质 它上面的任何两点之间的距离都是完全不变的 它们就像钻石那样坚硬 形状 shape 一块严格依附于物体 body 的2D碰撞几何结构 collisiongeometry 形状具有摩擦 friction 和恢复 restitution 的材料性质 约束 constraint 一个约束 constraint 就是消除物体自由度的物理连接 在2D中 一个物体有3个自由度 如果我们把一个物体钉在墙上 像摆那样 那我们就把它约束到了墙上 这样 此物体就只能绕着这个钉子旋转 所以这个约束消除了它2个自由度 接触约束 contactconstraint 一个防止刚体穿透 以及用于模拟摩擦 friction 和恢复 restitution 的特殊约束 你永远都不必创建一个接触约束 它们会自动被Box2D创建 关节 joint 它是一种用于把两个或多个物体固定到一起的约束 Box2D支持的关节类型有 旋转 棱柱 距离等等 关节可以支持限制 limits 和马达 motors 关节限制 jointlimit 一个关节限制 jointlimit 限定了一个关节的运动范围 例如人类的胳膊肘只能做某一范围角度的运动 关节马达 jointmotor 一个关节马达能依照关节的自由度来驱动所连接的物体 例如 你可以使用一个马达来驱动一个肘的旋转 世界 world 一个物理世界就是物体 形状和约束相互作用的集合 Box2D支持创建多个世界 但这通常是不必要的 积分器 integrator 积分器在离散的时间点上模拟物理方程 它将与游戏动画循环一同运行 通常来说游戏物理引擎需要至少60Hz的速度 也就是1 60的时间步 约束求解器 constraintsolver 约束求解器用于解决模拟中的所有约束 一次一个 要得到良好的解 需要迭代所有约束多次 建议的Box2D迭代次数是10次 Box2D注意事项 全局的对象的构造函数作了三件事情 1 一个在b2AABB类中的实例构建的坐标系统2 一个定义重力的向量 这是一个b2Vec2类构建的实例 3 一个布尔变量来定义对象是否 沉迷 如果你设置为true 对象将会沉迷 4 执行Step 函数 每一帧都会更新所有的Body在world中的位置 5 Box2D中的单位为米 30像素 1米 所以在box2D中经常会看到坐标点乘以30 这样就不奇怪为什么用30而不是15或者20的了 Box2DBody 创建好World后 可以向World内部添加任何球体或者盒子 以及你想到的任何形状的东西 那我就需要定义一个Body 一个body体大概需要做2 4件事情 1 定义一个形状2 一个 x y 的位置3 角度4 一个预制的Sprite对象其中3 4是可选操作 这里我可能不会讲到Box2D内设的一些画图类库 因为我们在实际的操作中 可能用的都是自定义的 内设的类库一般用来模拟比较好 进行实际开发可能不适合 所以大家有想研究内设画图类库的可能需要自己去研究一下了 Box2Db2ShapeDef 如果你想在你的游戏或者其他的什么中具有一些有特色的东西 你可以通过综合形状定义Body来制作一个Sprite 形状的定义 有3种类型的形状定义 他们都是扩展的b2ShapeDef基类 b2BoxDef类具有4个重要的属性 1 SetAsBox 设定边框 这是一个向量 本质上说他就是一个形状的中心坐标2 Density 密度 在碰撞的等式中使用密度 面积 质量 密度如果是0或者null 将会是一个静止的对象 3 Friction 摩擦力 这用来计算两个对象之间的摩擦 可以在0 0 1 0之间调整它们 4 Restitution 弹性 这是调整对象弹性程度的属性 可以在0 0 1 0之间调整它们 b2CircleDef类中有一个不同的属性 代替SetAsBox是他的Radius 半径 b2PolyDef类具有一个顶点数组 最大是8 来代替SetAsBox和Radius 这些顶点都是b2Vec2类型的对象 以下通过实例来讲述Box2D的基本用法 在打开源文件进行测试时 需要把Box2D的类库放在目录下面 程序才能正常运行 Box2DHelloWorld HelloWorld实例中会讲述Box2D的基础用法 1 准备好Box2D类库2 在画自己的形状时 如果不想自己给自己添乱 定义的形状width或者height尽量都能被30整除 这样便于我们的计算3 按前面的讲述 我们需要创建的全局变量里面要有一个World 记分器 约束求解器 同样还要准备一个盒子 b2AABB 重力 gravity 是否能睡眠 doSleep 4 添加形状需要用到b2Body b2BodyDef b2PolygonDef 多边形 b2CircleDef 圆形 这几个常用的类 HelloWorld里面的难点应该就是第4点 希望大家能注意一下 如果自己做例子时Rect与Circle应该怎样添加 例子中创建了静态地面与动态的物体 upData函数让整个世界运转起来 你可能不需要知道for循环里面到底是怎么运作的 只需要知道这个for循环让这个对象开始在世界中进行模拟就可以了 这个for循环是必须的 Box2D鼠标与刚体交互之移除选中刚体 此示例在HelloWorld的基础之上进行扩展 关键操作为getBodyAtMouse 函数 早起看过C 版本而写的此函数 现在网络上可能也能搜到类似的 但是都讲的不是很详细 不过这个函数你有可能不需要到底是怎样运行 仅仅知道这个函数返回与鼠标点相交的刚体就可以了 下面解释一下getBodyAtMouse 函数的机制 当鼠标点击时 得到当前鼠标的坐标点 在此鼠标点产生一个很小的刚体 半径在0 001内就有效 然后遍历整个世界内部与小刚体产生碰撞的刚体 最后返回碰撞的刚体 返回的刚体都是唯一的 说唯一是因为世界内部的对象都是刚体 既然是刚体 就不会产生两个刚体重叠或者相交的情况 所以大家不要感到我说的唯一很奇怪 Box2D鼠标与刚体交互之拖拽刚体 由于Box2D是不直接与鼠标交互的 而是通过鼠标关节b2MouseJoint交互的 交互的过程由四个步骤完成 第一步 获取鼠标单击处的刚体 第二步 创建鼠标关节 第三步 控制鼠标关节 第四步 销毁鼠标关节 获取刚体 publicfunctiongetBodyAtMouse world b2World stage Stage includeStatic Boolean true b2Body varmouseb2Vec b2Vec2 newb2Vec2 stage mouseX 30 stage mouseY 30 varaabb b2AABB newb2AABB aabb lowerBound Set mouseb2Vec x 0 001 mouseb2Vec y 0 001 aabb upperBound Set mouseb2Vec x 0 001 mouseb2Vec y 0 001 varmaxCount int 10 varshapesArray Array newArray varcount int world Query aabb shapesArray maxCount varbody b2Body for vari int 0 i count i if shapesArray i m body IsStatic includeStatic vartShape b2Shape shapesArray i asb2Shape varinside Boolean tShape TestPoint tShape m body GetXForm mouseb2Vec if inside body tShape m body break returnbody 创建关节 varlbf tempBody b2Body getBodyAtMouse lbf world stage if lbf tempBody 设置关节varlbf mouseJointDef b2MouseJointDef newb2MouseJointDef 设置body1为无碰撞检测形状的静态刚体lbf 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 在世界中创建这个b2MouseJoint对象lbf mouseJoint lbf world CreateJoint lbf mouseJointDef asb2MouseJointlbf mouseJointDef null lbf tempBody null 控制关节 控制鼠标关节很简单 就是在帧循环时间中不断更新鼠标关节的目标位置 if lbf mouseJoint lbf mouseJoint SetTarget newb2Vec2 mouseX 30 mouseY 30 销毁关节 if lbf mouseJoint lbf world DestroyJoint lbf mouseJoint lbf mouseJoint null 具体细节请详看 Box2D鼠标与刚体交互之拖拽刚体 Box2D键盘事件 在Box2D中 刚体不仅会受到重力 碰撞等影响 而且也可以施加一个力对它造成影响 可以通过至少以下这几个方法去移动一个刚体 publicfunctionApplyForce force b2Vec2 point b2Vec2 void向目标 世界位置 施加一个力 如果这个力不是施加在刚体的质心 它将产生一个扭矩并影响其角速度 在此之前 它将自动唤醒刚体 力的单位为N 1N 1kg m s 2 publicfunctionApplyImpulse impulse b2Vec2 point b2Vec2 void向目标 世界位置 施加一个冲量 它将立刻改变刚体的速度 如果这个力不是施加在刚体的质心 它将影响其角速度 在此之前 它将自动唤醒刚体 冲量的单位为kg m s或N s publicfunctionSetLinearVelocity v b2Vec2 void直接设置质心线速度 需要注意的是它是不会自动唤醒刚体的 所以你必须事先唤
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专利测试题附答案
- 中级消防设施操作员(维保)实操技能考试题库含答案(浓缩50题)
- 数字化供应链协同-第2篇-洞察与解读
- 2025年事业单位卫生类招聘考试预防医学专业知识试卷(答案详解)
- 2025年澳门特别行政区事业单位招聘考试综合类专业能力测试试卷(计算机类)真题模拟解析
- 2025年事业单位招聘考试综合类无领导小组讨论面试真题模拟试卷(创新能力)
- 2025年四川省事业单位招聘考试综合类专业能力测试试卷(化工类)真题模拟
- 2025福建泉州市丰泽区部分公办学校专项招聘编制内新任教师17人(二)模拟试卷及完整答案详解1套
- 智能安全监测系统-第5篇-洞察与解读
- 存储设备环境适应性评估-洞察与解读
- 国内地铁轨道公司组织架构
- 矩阵论同步学习辅导 张凯院 西北工业大学出版社
- GB/T 24218.1-2009纺织品非织造布试验方法第1部分:单位面积质量的测定
- GB/T 10357.1-2013家具力学性能试验第1部分:桌类强度和耐久性
- GB 16541-1996竖井罐笼提升信号系统安全技术要求
- GB 10068-2000轴中心高为56mm及以上电机的机械振动振动的测量、评定及限值
- 车辆模型课件
- 游泳训练理论与方法技术要点课件
- 促进深度学习的课堂教学策略专题研究
- 医疗护理品管圈QCC成果汇报之提高住院病人健康宣教的知晓率(问题解决型)
- 水泥厂化验室质量管理手册
评论
0/150
提交评论