这三个类是physx里常用的3个回调函数
NxUserContactReport:报告物体碰撞时的数据,用户可以在这里得到碰撞的具体信息
NxUserTriggerReport:是触发器,物体穿过、进入、离开触发器都会调用
NxUserContactModify:是physx提供的一个强大的在碰撞瞬间的修改机会,但是消耗量巨大,sdk中说推荐只有在极为重要的地方使用它,比如主角,另外如果使用硬件加速,将导致硬件返回执行,使硬件处于等待状态,另外这个函数还必须是reentrant函数。
今天主要研究的是NxUserContactReport。
NxUserContactReport只有一个函数用来被physx调用:onContactNotify,他有2个参数,一个NxContactPair,一个是事件类型。
目前这个函数只支持6个事件,另外3个未实现
NX_NOTIFY_ON_START_TOUCH:接触开始
NX_NOTIFY_ON_END_TOUCH:接触结束
NX_NOTIFY_ON_TOUCH:正在接触
NX_NOTIFY_ON_START_TOUCH_FORCE_THRESHOLD
NX_NOTIFY_ON_END_TOUCH_FORCE_THRESHOLD
NX_NOTIFY_ON_TOUCH_FORCE_THRESHOLD
threshold的意思是进入另一个物体x,才被认为是接触,NxActor::setContactReportThreshold函数用来设置这个值,默认是无限大,也就是说如果不设置的话,threshold的事件永远不会触发。
如果想要使事件生效,必须设置NxScene::setUserContactReport,然后为我们感兴趣的Shape,actor,actorGroup三个层面上任意设置NxContactPairFlag标志,只要有任意一个设置了,事件都会发生。
注意:Kinematic物体不会和kinematic物体产生这个事件。
下面进入NxContactPair参数:
Actors是一对发生碰撞的actor
isDeletedActor是标记这一对actor是否已经被删除。,如果是真,就不要使用这个actor了,他只是为了构造这个数据结构的。
stream是一个很强大的数据索引,有专门的迭代器NxContactStreamIterator访问它
sumFrictionForce是物体接触点的摩擦力总和
sumNormalForce是物体接触点法线反弹力的总和
如果用户想知道到底有那些位置接触,可以迭代stream查看
physx提供了一个很方便的迭代器NxContactStreamIterator
使用方法参见NxContactStreamIterator的帮助,写的很详细了。