欢迎转载,转载标明出处:http://blog.csdn.net/notbaron/article/details/38615603
上篇回顾
本篇名言:啊!到达人生的尽头,才发现自己没活过。[梭罗]
上篇中,我们学习了(上篇其实撒也没干基本上)Box2d物理引擎的三大模块之一的dynamics模块,该模块包含了大量的类。
接下去蛤蟆正式开始学习其中dynamics模块中的类,这次咱们学习body这个类。。
理论介绍
总体介绍:
Ok,body具有位置和速度。我们可以将力、力矩和冲量加给Body.Body可以是静态、动态和运动的(动态和运动是不是一样的?额,好吧,其实是不一样的)。静态的Body,就好比有无穷大质量,不好意思谁也挪不动,就没有速度了,不过我们可以手动移动它的,静态的Body不会和静态或者运动的Body发生碰撞。运动的Body,是具有速度的,说白了就是一块无穷重的物体在挪动,不会对外力做出反应的,可以通过用户挪动,但是通常是它自己的速度进行变化的,也不会和其他静态或者运动的Body发生碰撞。动态的Body,是会对外力做出反应的,具有非零质量,可以和任何body发生碰撞。
Body是fixture(shapes)的骨干。绑定到Body上fixture,会被Body带着移动。通过Body是刚体,所以绑定到Body上的2个fixture就永远不会有相对运动了。
Fixture有几何和密度。通常Body通过Fixtur获得质量。
Body定义
我们创建Body之前,必须创建一个Body定义就是b2BodyDef.这个b2BodyDef包含了创建Body所需要的所有数据。创建的Body的时候,会将b2BodDef的数据复制过去,所以我们可以复用一个b2BodyDef。
我们来看下Body定义了哪些关键的信息:
Body 类型,
分为三类static,kinematic, 和dynamic. 我们最后在开始就区分好Body类型,因为后期区分会非常的麻烦。 例如:bodyDef.type= b2_dynamicBody;
位置和角度,
Body有两个关键的点。一个是Body的起点,Fixture和Joints是通过起点来附属到Body上的。还有一个是质心位置,这个位置根据附属Shape的质量分布或者通过b2MassData.显示设置的。Box2d内部的很多计算都是使用质心的。当我们创建完Body的定义后,我们不知道质心是在哪里的。所以我们需要定义一个起点,通常也定义一个角度。这两个是不受质心影响的。当我们改变Body的质量后,质心会发生变化,但是位置以及附属的shape,joints都不会改变。
阻尼
阻尼是用来改变Body速度的。它不同于摩擦,因为摩擦是需要2个Body接触产生的(不过阻尼其实就是和空气接触,是和空气的摩擦嘛)。阻尼和摩擦是可以一起作用的。阻力的值可以设置0到无穷大。
重力
重力用来调整单个body。
睡眠参数
因为仿真非系统资源的嘛,所以没事的时候咱们就让没什么变化的Body一边睡觉去。当然,如果被碰撞,或者Body上的fixture或者joint被删除都会唤醒Body的(就是嘛,睡觉的时候被撞,衣服被扒了,肯定会醒的嘛)。我们也可以手动唤醒之的。
固定旋转
有时候我们需要一个刚体,可能不想让他受到一个力矩的时候发生旋转。我们就可以设置这个参数固定之。
子弹
默认的Box2d使用CCD(Continuous collisiondetection,连续碰撞检测)来避免动态Body穿过静态Body。一般情况下是不适用CCD的,因为会影响性能。但是当有高速物理的时候就需要了,防止那些高速的子弹穿过砖头。在Box2d中可以将高速移动的物体标记为子弹,那么它就会使用CCD了,是不是很方便,定义如下:bodyDef.bullet = true;当然是对动态的body有效。
激活
有时候我们需要Body创建之后不参数碰撞。类似与睡眠状态,但是又不会被碰撞唤醒(蛤蟆觉得应该是武侠中的假死状态)。需要注意的是激活一个Body的代价和创建一个Body一样。
用户数据
用户数据是一个空指针,可以将应用对象链接到Body上。
Body工厂
学完Body定义,我们来看下如何创建Body。
b2Body* dynamicBody = myWorld->CreateBody(&bodyDef);//通过World创建一个Body ... do stuff ..//这里就是对Body的处理,略过 myWorld->DestroyBody(dynamicBody);//删除Body dynamicBody = NULL;//指针赋NULL |
如果我们删除整个物理世界,那么就不要清理指针的了。
当摧毁一个Body 时,附属在上面的fixture和joints也就一并销毁了。
使用Body
创建Body之后,可以有很多操作来针对Body。包括设置质量属性,访问位置,访问速度,施加作用力,改变坐标和向量。
对于一个Body它拥有质量,质心,转动惯量等。
静态的Body 质量和转动惯量为0。此外当一个Body固定旋转时,其转动惯量也是0。
设置质量大小:voidSetMassData(const b2MassData* data);
如何获取Body的信息呢?可以如下操作:
void SetType(b2BodyType type);//设置Body类型 b2BodyType GetType();//获取Body类型 void SetBullet(bool flag); bool IsBullet() const; //是否为子弹类型 void SetSleepingAllowed(bool flag); bool IsSleepingAllowed() const; //是否允许睡眠 void SetAwake(bool flag); bool IsAwake() const; //是否被唤醒了 void SetActive(bool flag); bool IsActive() const; //是否被激活了 void SetFixedRotation(bool flag); bool IsFixedRotation() const; //是否固定了旋转 |
通过以上我们可以获取绝大多数Body的状态了。这些状态也是我们在定义的时候设置的有木有?
总结
本次蛤蟆学习了dynamcis模块中的body类,不知道小伙伴们有没有收获哈。接着蛤蟆学习Fixtures类。