转载标明出处:http://blog.csdn.net/notbaron/article/details/38689643
上篇回顾
本篇名言:要能感觉存在,就需加强对美的感受力。[詹姆士·雷德非]
上篇中,我们学习了Box2d物理引擎dynamics模块中的Joint类,基本是根据官方文档进行的初步介绍。
接下去蛤蟆继续学习dynamics模块中的类,这次咱们学习Contact这个类。。
理论介绍
Contact是Box2d 创建的用来管理两个Fixture发生碰撞的对象。
根据不同的 F ixture类型,会有不同的Contact类来管理。
蛤蟆介绍下和接触类相关的术语:
点接触
点接触是两个shape接触。
普通接触
普通接触,是一个单位向量,从一个shape指向另一个Shape.
分离接触
分离和渗透的相反含义。当shape重叠时,分离为负。后续Box2d可能会使用正分离。
多样接触
当两个复杂的多边形接触的时候,会有2个接触点,他们就会被分组到多样接触。
正常冲量
正常力是施加在接触点的,防止形状发生穿透的。正常脉冲只是正常的力乘以时间步长而已。
切线冲量
切线力是在接触点产生用于模拟摩擦的。该存储为冲量。
接触ID
Box2d会复用一个接触力。而这个ID包含了几何特性用于区分接触点。
Contact(接触)类
Contact类是由Box2d创建的不是用于创建的。但是我们可以访问并与之交互。
访问接触
我们可以通过WORLD类或者Body的结构体来访问Contact类。
不过通过World和Body访问接触类,可能会错过一些短暂的接触。使用b2ContactListener监听就不会了(监听可以抓住每个短暂的接触)。
接触监听
可以通过监听获取接触数据。监听提供了很多事件(events):包括开始,结束,预处理和后处理。
开始接触事件:当两个Fixture重叠的时候会被调用。这个事件只在时间步内发生。
结束接触事件:当两个Fixture停止重叠时候被调用。这个事件可以在时间步之外发生。
预处理事件:这个调用发生在碰撞检测之后,碰撞处理之前。这个时间可以让我们有机会根据当前的配置禁用contact.
后处理事件:这个事件用于收集碰撞冲突结果。
接触过滤
我们通常不需要所有的物体进行碰撞。比如创建一个门只用于角色穿过。
我们可以通过b2ContactFilter类 是实现接触过滤。需要我们定义一个ShouldCollide函数,当Shapes能发生碰撞的话就返回true.
在运行时,可以创建一个接触过滤实例,并通过b2World::SetContactFilter注册之。
总结
本次蛤蟆学习了dynamcis模块中的Contact类,如果有疑问欢迎交流。接着蛤蟆学习Box2d中最霸气的world类。