使用MeshGeometry3D进行碰撞检测

时间:2009-08-19 16:27:33

标签: c# wpf visual-studio collision-detection cad

我正在创建类似CAD的程序,创建modelvisual3D对象。如何使用MeshGeometry3D在我的对象(modelvisual3d)之间进行碰撞检测。我是否必须将移动物体中的每个三角形与静止物体进行比较?

我最好的碰撞检测方法是什么?

4 个答案:

答案 0 :(得分:0)

这取决于您的碰撞检测需要多精确。

WPF的3D库中没有内置的碰撞检测功能。如果您需要高精度,则需要比较每个三角形。

话虽如此,你可以从比较边界框和/或边界球开始。这始终是一个很好的第一步,因为它可以快速消除大多数情况。如果您不需要精确碰撞检测,单独这可能没问题。

答案 1 :(得分:0)

添加到Reed的答案(基于我的answer here):

在通过边界框/球体消除大部分对象到边界框/球体测试后,您应该在检查三角形/三角形之前先测试测试对象的三角形与另一个对象的边界框/球体碰撞。这将消除更多案件。

要排除碰撞,你必须检查测试对象中的所有三角形,但是为了找到你需要找到三角形/三角形的情况,你只需要找到第一个三角形与另一个对象的边界框/球体交互。

答案 2 :(得分:0)

看看SAT定理(分离轴定理),它是那里最快最简单的定理。

关于这一点的理论是,如果你可以绘制一条分隔三角形的线,那么它们就不会碰撞。

如上所述,首先进行AABB早期检测,当两个物体发生碰撞时,测试物体A的每个多边形与物体B的每个多边形。

从2D开始,为了测试两个多边形是否碰撞,你可以在可能的轴上获得它们的范围(在这种情况下是X和Y),如果这些范围相交,那么poligons就会发生碰撞。

在此页面上,您可以找到有关其工作原理以及如何应用它的非常好的解释: http://www.metanetsoftware.com/technique/tutorialA.html

要将其应用于3D,只需使用每个多边形的边作为分离轴。 如果这些轴上的范围相交,则多边形会发生碰撞。

此外,这种方法解决了移动物体的碰撞,也给出了碰撞的动量(解决了相对角速度,从速度A减去速度B,这样问题就减少为移动物体和静止物体,并添加您正在测试多边形A范围内的轴的速度,如果它们相交,则保持多边形的原始范围,您将获得碰撞的动量。)

答案 3 :(得分:0)

另一种选择是使用BulletSharp,这是众所周知的Bullet Physics Engine的C#包装器。在这种情况下,您需要编写函数以从MeshGeometry3D创建(凹)碰撞形状。

根据我的经验,即使不支持凹形之间的动态碰撞,它也能很好地工作。您需要使用凸分解作为解决方法。