首页 > 代码库 > 瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍
瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍
上篇回顾
本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源。而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非]
上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型。物体碰撞的具体都在该类中。
蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类。
理论介绍
World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异步查询。
创建一个World非常简单,只需要一个重力向量和布尔类型(标注Body是否可以睡眠)。
World类被用来驱动仿真。定义一个时间步,速度和位置迭代次数。
我们需要使用一个固定的时间步长,不过使用大的时间步长可以改善低帧率的场景。时间步长最好小于1/30秒,如果是1/60秒那会得到比较好的效果的。
迭代次数控制接触中多少次解析扫描。不要使用太多的迭代数量,60赫兹的10次迭代比30Hz的20次迭代更好。最后调用b2World::CleareForces()函数删除外力。
探索世界
World是body,contact和Joint类的容器。
可以很容易的得到World里面的所有Body。如下:
for (b2Body* b = myWorld->GetBodyList(); b; b = b->GetNext()) { GameActor* myActor = (GameActor*)b->GetUserData(); if (myActor->IsDead()) { myWorld->DestroyBody(b); // ERROR: now GetNext returns garbage. }} |
不过上面代码有个问题,如果其中一个Body是毁掉的,那么GetNext()函数得到是一个垃圾。解决方案是在毁掉Body之前复制指针。
查询
有时候你要知道一个区域中的所有SHAPE。World类中有一个快速的Log函数用来使用broad-phase的数据结构。
通常提供一个Body的世界坐标和b2QueryCallback函数。当有Fixture覆盖到Body时,就会调用之。
镭射
可以使用镭射来检测实现。通过一个回调函数和提供开始和结束点来实现镭射。当一个Fixture碰到射线的时候World就会调用你的类。回调函数提供Fixture,交叉点,单位向量,和距离。注意由于小数误差,镭射线可以透过小的缝隙,如果应用程序不接受,可以适当的放大形状。
力和冲量
可以讲力,力矩和冲量施加给Body.当施加力和冲量的时候需要一个作用点。施加力或者冲量会唤醒Body。
坐标转换
Body类有函数可以让我们在本地和世界空间转换坐标。
遍历
我们可以遍历Body上的所有Fixture。 同理,我们也可以遍历所有的Joint,contacts。不过需要注意的是,Contact在上一个时间步不一定都存在的。
总结
本次蛤蟆学习了dynamcis模块中的World类,如有错误欢迎小伙伴们斧正之。