首页 > 代码库 > 瘸腿蛤蟆笔记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类,如有错误欢迎小伙伴们斧正之。