转载标明出处:http://blog.csdn.net/notbaron/article/details/38637071
上篇回顾
本篇名言:好的木材并不在顺境中生长;风越强,树越壮。 [马里欧特]
上篇中,我们学习了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类。