使用无干扰的碰撞避免(转向)时,运动对象发生碰撞


9

我无法避免未避免的碰撞,我认为这是一种罕见的情况。我将两个对象设置为彼此相对,但有一点偏移,因此其中一个对象稍微向上移动,而其中一个对象稍微向下移动。

在我未对齐的防撞转向算法中,我在两条直线最接近的物体的正线上和另一个物体的正线上找到了点。如果这些最接近的点在避免碰撞的距离内,并且它们之间的距离小于两个对象的边界球的两个半径,则对象应沿适当的方向转向。

问题在于,对于我而言,计算得出的直线上最接近的点实际上与实际的碰撞点相距甚远。这是因为随着对象的通过,每个对象的两条前向线彼此远离。问题在于,因此,没有进行转向,并且两个对象部分碰撞。

对象前进线的屏幕截图。

有人对我如何正确计算碰撞点有任何建议吗?也许通过某种方式考虑到两个对象的大小?


请注意,在屏幕截图中,绿线,红线和蓝线仅是3D世界的轴。
James Bedford

Answers:


6

这是迄今为止我遇到的最好的球对球碰撞检测文章。

台球馆课程:圆或球之间的快速,准确的碰撞检测


我知道如何进行球体碰撞测试。我的问题是试图找到将来发生碰撞的位置。谢谢。
James Bedford

@James的文章将解决您的问题。看一下第2页,您可以使用任意高的数字表示一个球体上的“速度”,以确定“将来”的碰撞点。
Tetrad

好的-很抱歉没有将其签出,它看起来确实不错!阅读后,我将不得不与您联系。谢谢:)
詹姆斯·贝德福德

1
我能否澄清一下,在第2页的“射门:两个运动的圆之间的碰撞”部分下,这意味着您应该在算法中使用两个圆的速度之间的差而不是第一个圆的速度?(在算法的固定版本中未使用第二个圆的速度。)这一点对我来说不太清楚。谢谢。
詹姆士·贝德福德

0

您不想找到最接近的点。

您想在直线上找到距离等于两个球体的合并半径的点。


喔好吧!你知道我怎么能用数学的方法解决这个问题吗?
James Bedford

0

如果我正确地理解了您的问题,您可以简单地使用Sphere vs Sphere相交测试,如AttackingHobo所建议的那样。

进行此类测试的数学方法如下(如果我错了,请纠正我,已经有一段时间了)。同样,这是考虑到您的球体的中心和半径均可变。

检查公式如下所示:

distanceOfSpheres <= sumOfRadii^2

您有一个球体与球体的交点。这非常简单,让我们看看代码中的样子!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

同样,我认为这是您可能正在寻找的正确答案。如果有人知道这是错误的,请纠正我,因为自从我做完这个数学已经有一段时间了。


我知道如何进行球体碰撞测试。我的问题是试图找到将来发生碰撞的位置。谢谢。
James Bedford

0

好的,希望这是有道理的...获取球的向量并计算其碰撞点,称为p1。找到两个向量之间的角度,称为a1。在a1 / 2处画一条线,该线将恰好在两个向量之间的度数中间。您需要在这条线上的位置为sin(a1 / 2)=(radius1 + radius2)/ 2。如果这张照片在我的右脑中可见,那就是发生碰撞的地方。抱歉,这是错的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.