之前,我们在从PhysX2.8升级到PhysX3.2(4) 中就说到了,在PhysX 3.2中,物体之间的碰撞过滤都利用一个新增的FilterShader函数中实现。在模拟时,SDK在判断两个物体是否需要碰撞的是时候,会用这一对物体的相关信息来调用FilterShader。这一篇中,我们就具体介绍实现方式。
关于SDK里面碰撞过滤的设计和实现,有几个概念要明确:
a. 碰撞过滤函数的定义:也就是你定义的 FilterShader 函数。这个函数在模拟时,SDK根据检测到的相互有碰撞的物体对的信息来调用,传入的信息有这一对物体中各自的Attribute和FilterData (请注意这只是建议使用的数据,还有constantBlack等,但是由于涉及到内存读取,并且这个函数是性能攸关的函数,因此一般情况下不建议使用),传出的信息有两个:一个是返回值PxFilterFlags,一个是引用传出值pairFlags。
b. 物体的 Attribute和FilterData:Attribute在选择创建哪种对象的时候就确定了,不能更改;但FilterData是设置到物体的PxShape之上的,并且是可以修改的。这两个参数,在filterShader函数被调用时,会被传入。
c. 碰撞过滤回调函数: 如果a 不够用(也就是说,不光要控制物体间的碰撞,还要知道碰撞的更多信息用于进一步处理),还可以定义一个回调函数来进