我正在创建类似 CAD 的程序,创建 modelvisual3D 对象。如何使用 MeshGeometry3D 在我的对象(modelvisual3d)之间进行碰撞检测。我是否必须将移动物体中的每个三角形与静止物体进行比较?
我进行碰撞检测的最佳方法是什么?
我正在创建类似 CAD 的程序,创建 modelvisual3D 对象。如何使用 MeshGeometry3D 在我的对象(modelvisual3d)之间进行碰撞检测。我是否必须将移动物体中的每个三角形与静止物体进行比较?
我进行碰撞检测的最佳方法是什么?
这取决于您的碰撞检测需要有多精确。
WPF 的 3D 库中没有内置的碰撞检测。如果您需要高精度,则需要比较每个三角形。
话虽如此,您可以从比较边界框和/或边界球开始。这始终是一个很好的第一步,因为它可以快速消除大多数情况。如果您不需要精确的碰撞检测,仅此一项就可以了。
要添加到 Reed 的答案(基于我的答案here):
在您通过边界框/球体到边界框/球体测试消除了大部分对象后,您应该在检查三角形/三角形碰撞之前先针对另一个对象的边界框/球体测试测试对象的三角形。这将消除更多的情况。
要排除碰撞,您必须检查测试对象中的所有三角形,但要找到需要深入到三角形/三角形案例的案例,您只需要找到第一个与另一个对象的边界框/球体。
看看 SAT 定理(分离轴定理),它是最快和最简单的。
关于这一点的理论是,如果你可以画一条分隔三角形的线,那么它们就不会发生碰撞。
前面说了,先做一个AABB较早的检测,当两个物体发生碰撞时,将物体A的每个多边形与物体B的每个多边形进行测试。
从 2D 开始,为了测试两个多边形是否发生碰撞,您可以在可能的轴(在本例中为 X 和 Y)中获得它们的范围,如果这些范围相交,那么这些多边形正在碰撞。
在此页面上,您可以找到关于它如何工作以及如何应用它的非常好的解释: http ://www.metanetsoftware.com/technique/tutorialA.html
要将其应用于 3D,只需使用每个多边形的边缘作为分离轴。如果这些轴上的范围相交,则多边形正在碰撞。
此外,该方法解决了运动物体的碰撞,也给出了碰撞的动量(解决了相对角速度,从速度 A 中减去速度 B,这样问题就简化为运动物体和静止物体,并将速度添加到您正在测试的轴到多边形 A 的范围,如果它们相交,则保持多边形的原始范围,您将获得碰撞动量)。
另一种选择是使用BulletSharp,它是著名的Bullet Physics Engine的 C# 包装器。在这种情况下,您需要编写函数来从 MeshGeometry3D 创建(凹)碰撞形状。
根据我的经验,它工作得很好,即使不支持凹形之间的动态碰撞。您需要使用凸分解作为解决方法。