我正在使用PhysX.NET(PhysX的C#包装器),我正在尝试使用SimulationEventCallBack中的onContact获取两个球体之间的碰撞通知。
我为SimulationEventCallback创建了一个新的子类,并重写了OnContact方法,以便在发生碰撞时给我一条消息。然后我将场景的simulationEventCallback设置为我的子类的实例。即使两个球体(刚性动态)明显碰撞,这也不起作用。以下是我的代码:
//创建子类
public class robotCollision : SimulationEventCallback
{
public override void OnContact(ContactPairHeader pairHeader, ContactPair[] pairs)
{
base.OnContact(pairHeader, pairs);
Rhino.RhinoApp.Write("Contact!");
}
}
//创建场景
scene = engine.CreateScene(sceneDesc);
scene.SetSimulationEventCallback(myContactCallback,0);
还有其他需要考虑的事项吗?要设置的任何标志? 我很抱歉,如果这是一个非常天真的问题,但我已经在这一天工作了一整天似乎非常简单,我无法绕过它。
提前致谢。
答案 0 :(得分:0)
我是 PhysX C++ 用户,所以我不会将此标记为解决方案。
通常,您需要使用 PxSimulationFilterShader
或 PxSimulationFilterCallback
定义两个参与者之间的联系。
后者是您需要实现的特定回调,所以我怀疑您是否愿意这样做。
将提供默认的 PxSimulationFilterShader
,因此无需担心。
为了使过滤器着色器工作,您必须为角色定义碰撞组和遮罩。请参阅 PxSetGroup
和 PxSetGroupsMask
。
该组只是一个介于 0-31 之间的数字 ID。
掩码是 4 个短裤 (PxU16) 位集,定义了“对于每个组,我应该与谁发生冲突”。
现在组掩码有点挑剔.. 背后的数学是.. 烦人...
但是您可以使用更简单的方法实现自己的碰撞过滤,使用组掩码中的输入数据。 PhysX 代码和文档中提供了有关如何执行此操作的示例。见Collision Filtering
再说一次,我是一个 C++ 答案,我确定 C# 包装器中有类似的东西。