1

我正在使用 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);

还有其他需要考虑的吗?有什么要设置的标志吗?如果这是一个非常幼稚的问题,我很抱歉,但我已经为此工作了一整天,因为这似乎很简单,我无法理解它。

提前致谢。

4

1 回答 1

1

我是 PhysX C++ 用户,所以我不会将此标记为解决方案。通常,您需要使用PxSimulationFilterShader或 定义两个参与者之间的联系PxSimulationFilterCallback。后者是您需要实现的特定回调,所以我怀疑您是否想要这样做。将提供默认值PxSimulationFilterShader,因此无需担心。

为了使过滤器着色器工作,您必须为演员定义一个碰撞组和蒙版。见PxSetGroupPxSetGroupsMask。该组只是一个介于 0-31 之间的数字 ID。掩码是一个 4 短裤 (PxU16) 位集,用于定义“对于每个组,我应该与谁发生冲突”。现在组掩码有点挑剔......背后的数学是......烦人......但是您可以使用组掩码中的输入数据,使用更简单的碰撞过滤来实现自己的碰撞过滤。PhysX 代码和文档中提供了有关如何执行此操作的示例。见碰撞过滤

同样,我是一个 C++ 答案,我确信 C# 包装器中有类似的东西。

于 2021-03-14T11:03:09.700 回答