我使用的是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);还有什么需要考虑的吗?有什么要设置的旗帜吗?我很抱歉,如果这是一个非常天真的问题,但我花了一整天的时间为一些似乎相当简单的事情而工作,我无法把我的头围绕在它上面。
提前谢谢。
发布于 2021-03-14 11:03:09
我是一个PhysX C++用户,所以我不会将其标记为解决方案。通常,您需要使用PxSimulationFilterShader或PxSimulationFilterCallback在两个参与者之间定义一个联系人。后者是您需要实现的特定回调,因此我怀疑您是否想这样做。将提供一个默认的PxSimulationFilterShader,这样就不用担心了。
要使滤镜着色器工作,必须定义一个冲突组和掩码。见PxSetGroup和PxSetGroupsMask。这个组只是介于0-31之间的一个数字ID。掩码是一个4短路(PxU16)位集,它定义了“对于每个组,我应该与谁碰撞”。现在这个团体面具有点挑剔。后面的数学是..。烦人..。但是,您可以使用组掩码中的输入数据,使用更简单的冲突过滤来实现自己的冲突过滤。在PhysX代码和文档中有关于如何这样做的示例。请参阅碰撞滤波
同样,我是一个C++的答案,我确信在C#包装器中也有类似的东西。
https://stackoverflow.com/questions/34560653
复制相似问题