首页 > 代码库 > 瘸腿蛤蟆笔记31-cocos2d-x-3.2 Box2d物理引擎Fixture类介绍

瘸腿蛤蟆笔记31-cocos2d-x-3.2 Box2d物理引擎Fixture类介绍

上篇回顾

本篇名言:好的木材并不在顺境中生长;风越强,树越壮。 [马里欧特]

上篇中,我们学习了dynamics模块中的Body类,从定义到创建再到使用基本上都覆盖了,就差实战了(这个蛤蟆后在后面中补上的)。

接下去蛤蟆继续学习dynamics模块中的类,这次咱们学习Fixture这个类。

 

理论介绍

         我们知道Shape可以不知道Body,独立于物理仿真使用。所以Box2d需要Fixture类来将shape附加到Body。一个Body可以有1个或者多个Fixture。一个拥有多个fixture的Body通常被叫做复合Body.

         Fixture包含如下:

                   拥有单独的shape

                   Broad-phase代理

                   密度,摩擦力,恢复特性

                   碰撞过滤标志

                   指向父Body的指针

                   用户数据

                   传感器指标

         Fixture创建

         Fixture通过初始化fixture定义来创建。然后见给这些定义传递给父Body.

b2FixtureDef fixtureDef;//fixture定义

fixtureDef.shape = &myShape;//添加shape

fixtureDef.density = 1.0f;//定义密度

b2Fixture* myFixture = myBody->CreateFixture(&fixtureDef);//通过定义创建Fixture,并传递给Body.

         b2Fixture变量不需要保存,因为Body摧毁的时候这个也自动摧毁了。

         密度

         密度是用来计算父Body的质量属性的。我们最好将fixture设置成类似的,这样便于堆栈的稳定。此外Body的质量不会随着密度改变而立即改变,需要通过调用含税

         Body->ResetMassData();来生效的。

 

         摩擦

         Box2d提供静态和动态的摩擦,不过使用是同一个参数。

         我们学物理的时候学过,摩擦力是等于正压力乘以摩擦系数的。我们可以将摩擦系数设置成0到1,其实可是任何非负数的。    

         两个Shape的摩擦系数是相乘得到的,所以如果一个Shape的摩擦系数为0,那么他们之间就是没有摩擦力了。

 

         恢复

         恢复是用来设置物理反弹的。通常设置成0到1.如果设置为0,那么物理就不会反弹了。

         如果是1那就会完全反弹了。类似弹弹球那样的了。当速度很小时,就不会反弹了。这个主要是为了防止抖动。

 

         过滤

         过滤允许我们过滤掉我们不需要的碰撞,比如我们一个角色骑自行车,那么我们需要自行车和地面碰撞,但是不需要角色和自动车的碰撞。我们可以通过过滤来实现这个。

         Box2d提供了16中碰撞类型。我们可以将Fixture定义中其中一种。

         此外我们还可以定义组,不过组过滤的优先级要比类别过滤优先级高。

         Box2D自带一些过滤机制:

                   静态Body只能与动态Body碰撞

                   运行Body也只能与动态Body碰撞。

                   在同一个Body上的Fixture永远不会碰撞。

                   一个连接机构连接的Fixture可以手动选择是否开启碰撞。

 

传感器

         有时候我们需要知道两个Fixture之间发生了覆盖,但是不需要进行任何动作。这就需要传感器的了。

         我们可以标记一个Fixture为传感器。传感器可以是动态,静态和运动的。

         传感器不产生接触点,我们有两种方式来获取传感器:

b2Contact::IsTouching

b2ContactListener::BeginContact andEndContact

        

总结

         本次蛤蟆学习了dynamcis模块中的Fixtures类,不知道讲的清不清楚,有错误希望能斧正之。后续蛤蟆学习Joints类。