两个移动四面体之间的连续碰撞检测

18

我的问题很简单。我有两个四面体,每个四面体都有当前位置、空间中的线速度、角速度和重心(实际上是旋转中心)。

基于这些数据,我正在尝试找到一个(快速)算法,精确确定它们是否会在某个时间点发生碰撞,如果是这种情况,算法能够准确地确定(1)它们在多长时间后发生碰撞,以及(2)碰撞点。

大多数人会通过三角形-三角形碰撞检测来解决此问题,但这将浪费一些CPU周期进行冗余操作,例如在检查不同三角形时检查一个四面体的相同边缘与另一个四面体的相同边缘。这只意味着我会对事物进行优化,无需担心。

问题在于,我不知道任何公共的连续碰撞检测(CCD)三角形-三角形算法可以考虑自我旋转。

因此,我需要一个算法,该算法将输入以下数据:

  • 三个三角形的顶点数据
  • 位置和旋转/质量中心
  • 线性速度和角速度

并输出以下内容:

  • 是否存在碰撞
  • 碰撞发生的时间
  • 碰撞点在哪个空间中

提前感谢您的帮助。


3
+1仅仅因为标题太酷了--如果你想的话,你无法使它更好!-)。(很抱歉我对三维计算几何没有足够的专业知识来提供实际帮助)。 - Alex Martelli
3
是的,这个标题很酷。我记不太清数学知识来解决这个问题,但我相信你会想要解决一个微分参数方程来建模每个物体的当前位置(x,y,z)=(f(t),g(t),h(t))。你可以通过首先找到它们是否足够接近以基于每个物体的最小球体进行碰撞来优化它。如果它们没有,它们就不会碰撞。如果它们碰撞了,那么你就可以做复杂的计算。 - cletus
楼主在这里。我可能会使用其他技术来过滤哪些对象对需要进行碰撞测试(有些人称之为广义相位)。如果没有人提出任何真正的方程或更好的方法来解决这个问题,我将把所有东西放在一个距离方程中(关于时间),并编写一个算法来尝试找到解决方案。说实话,如果已经有人做过了,我真的不想这样做。 - x26
7个回答

6
常用的离散碰撞检测会对每个形状的三角形进行碰撞检测,随着时间的离散点逐渐计算。虽然计算简单,但由于碰撞发生在测试的离散时间点之间,可能会漏掉快速移动的物体撞击另一个物体的情况。
连续碰撞检测将首先计算每个三角形在无限时间内所跟踪的体积。对于匀速且不旋转移动的三角形,该体积可能看起来像一个三棱柱。然后CCD将检查两个体积之间的碰撞,并最终追溯三角形实际共享相同空间的时间。
当引入角速度时,每个三角形跟踪的体积不再像棱柱那样。它可能更像一颗螺钉的形状,像DNA的链或者你可以通过围绕某个任意轴线旋转三角形并沿线性拖动它而得到的其他非平凡形状。计算这种体积的形状并不容易。
一种方法可能是首先计算包含整个四面体的球体,当该四面体以给定的角速度向量旋转时,如果它不是沿直线运动。可以为每个顶点计算旋转圆,并从中导出球。给定球体,我们现在可以将挤压的CCD体积近似为半径为该球体并沿着线性速度矢量递进的圆柱体。查找这些圆柱体的碰撞会让我们得到一个搜索碰撞区域的第一个近似值。
第二种补充方法可能尝试通过将其分解为小的、几乎是棱柱形的子体积,来近似实际由每个三角形跟踪的体积。它将在两个时间增量处获取三角形位置,并添加由追踪这些时刻的三角形顶点生成的表面。这是一种近似,因为它连接的是直线而不是实际曲线。为了避免粗大误差,必须使每个连续时刻之间的持续时间足够短,以使三角形只完成小部分旋转。该持续时间可以从角速度中导出。
第二种方法创建了更多的多边形!您可以使用第一种方法来限制搜索体积,然后使用第二种方法来获得更高的精度。
如果您正在为游戏引擎解决此问题,您可能会发现上述精度足够(我仍然会对计算成本感到不安)。如果您在编写CAD程序或撰写论文,则可能会发现它不够令人满意。在后一种情况下,您可能需要完善第二种方法,例如更好地描述转动、移动三角形占用的体积-当限制为小的旋转角度时。

楼主在这里。感谢您的贡献。我更倾向于采用精确且快速的方法来解决问题。如果我想要一个近似值,我会简单地使用非常小的时间步长进行离散碰撞检测。如果我不关心时间,我会使用类似二分法的方法来找到碰撞前的精确点,直到一定数量的小数位数。 - x26
1
我会选择两个球体的碰撞,因为在三维中,圆柱/圆柱的碰撞非常快速(基本上只是检查空间中两条直线之间的最小距离)。所以首先你需要检查圆柱是否碰撞,然后再看球体是否碰撞(是否同时位于碰撞体积内)。然后在离散时间内进行三角形检查。角速度破坏了大多数通常在该阶段拥有的快捷方式。 - Nosredna

1

我花了很多时间思考这样的几何问题,尽管它们的陈述很简单,但精确的解决方案似乎过于复杂,即使是类似的二维情况也是如此。

但直觉告诉我,当考虑到线性平移速度和线性角速度时,这样的解决方案确实存在。不要指望在网上或任何书中找到答案,因为我们所讨论的是特殊而又复杂的情况。迭代解决方案可能是您想要的 -- 其他人都满足于这些,那么为什么您不能呢?


5
我在这里。如果将“其他人都满意,那你为什么不能满意?”这种逻辑应用于大多数日常创新的话,我们现在可能仍在使用蜡烛和马车。 - x26

1
如果您想要碰撞非旋转四面体,我建议使用Minkowski和并执行光线检查,但这无法用于旋转。
我能想到的最好方法是使用它们的包围球执行扫描球碰撞,以给您一个时间范围,然后使用二分法或其他方法进行检查。

1

这里是一个封闭形式数学方法的概述。每个元素都很容易单独表达,如果能够将它们组合起来,最终的组合将是一个封闭形式表达式:

1) 每个四面体点的运动方程在它自己的坐标系中非常简单。质心的运动只会沿着一条直线平滑移动,角点将围绕通过质心的轴旋转,这里假设为z轴,因此每个角点的方程(由时间t参数化)为p=vt+x+r(sin(wt+s)i+cos(wt+s)j),其中v是质心的速度向量;r是投影到x-y平面上的半径;ijk是x、y和z单位向量;x和s解释了t=0时的起始位置和旋转相位。

2) 注意每个对象都有自己的坐标系以便于表示运动,但是要比较它们,您需要将每个对象旋转到一个共同的坐标系中,这个坐标系可以是屏幕的坐标系。 (请注意,不同的坐标系固定在空间中,而不是随着四面体移动。)因此,确定旋转矩阵并将其应用于每个轨迹(即每个四面体的点和CM)。

3) 现在您拥有了每个轨迹的方程,全部在同一个坐标系内,您需要找到交点的时间。这可以通过测试从点到四面体的CM的线段是否与另一个三角形相交来找到。这也有一个封闭形式的表达式,可以在这里找到。

分层这些步骤会产生非常丑陋的方程,但是计算求解它们并不难(尽管在旋转四面体时,您需要确保不会陷入局部最小值)。另一个选择可能是将其插入到像Mathematica之类的软件中,让它为您完成计算。(并非所有问题都有简单的答案。)


0

你的问题可以转化为一个线性规划问题,并且可以精确地解决。

首先,假设(p0,p1,p2,p3)是时刻t0的顶点,(q0,q1,q2,q3)是第一个四面体在时刻t1的顶点,则在4D时空中,它们填充以下4D闭合体积

V = { (r,t) | (r,t) = a0 (p0,t0) + … + a3 (p3,t0) + b0 (q0,t1) + … + b3 (q3,t1) }

这里a0...a3和b0...b3参数在区间[0,1]内,并且总和为1:

a0+a1+a2+a3+b0+b1+b2+b3=1

第二个四面体同样是一个凸多边形(在上述所有内容后面添加“ '”以定义该移动四面体的4D体积)。

现在,两个凸多边形的交集是一个凸多边形。 第一次发生这种情况将满足以下线性规划问题:

如果(p0,p1,p2,p3)移动到(q0,q1,q2,q3) 并且(p0',p1',p2',p3')移动到(q0',q1',q2',q3') 则第一次相交发生在点/时间(r,t):

最小化t0 *(a0 + a1 + a2 + a3)+ t1 *(b0 + b1 + b2 + b3),满足以下条件

0 <= ak <=1, 0<=bk <=1, 0 <= ak’ <=1, 0<=bk’ <=1, k=0..4
a0*(p0,t0) + … + a3*(p3,t0) + b0*(q0,t1) + … + b3*(q3,t1) 
  = a0’*(p0’,t0) + … + a3’*(p3’,t0) + b0’*(q0’,t1) + … + b3’*(q3’,t1)

最后实际上是4个方程,每个(r,t)维度一个。 这总共是16个值ak、bk、ak'和bk'的20个线性约束条件。 如果有解,则

(r,t)= a0*(p0,t0) + … + a3*(p3,t0) + b0*(q0,t1) + … + b3*(q3,t1)

这是第一个交点。否则它们不相交。


除非你完全不处理旋转,而这正是OP明确要求的。 - Jay Lemmon
q点可以是p点的旋转版本。中间值是线性插值的旋转。这比其他建议的“离散化和数值求解”方案要好得多。 - Warren MacEvoy

0

曾经考虑过这个问题,但后来失去了兴趣...解决它的最佳方法是抽象出一个对象。 建立一个坐标系,其中第一个四面体是中心(重心坐标或一个有一个点作为原点的倾斜系统),通过使另一个四面体绕中心旋转来抽象出旋转。如果您将旋转时间乘以时间,则应该得到参数方程式。 添加质心向第一个四面体移动及其自旋,您就有了一组相对于第一个四面体的运动方程式(距离)。 求解距离等于零的t。

显然,使用这种方法,您添加的效果越多(如风阻力),方程式就会变得越混乱,但它仍然可能是最简单的方法(几乎每种其他碰撞技术都使用这种抽象方法)。最大的问题是,如果您添加任何具有无解析解的反馈效应,整个方程式就会变得无法解决。

注意:如果您选择倾斜系统的路线,请注意距离的陷阱。您必须在正确的八分之一!尽管如此,这种方法更偏爱向量和四元数,而重心坐标则更偏爱矩阵。因此,请选择您的系统最有效使用的方法。


0

抱歉,我不是数学专家,也不知道正确的术语是什么。希望我的用词不会太过含糊。

选择任意时间步长。

计算每个形状在垂直于其移动轴的两个维度上的边界,以进行时间步长。

对于一个时间步长: 如果任何两个对象的这些边界的轴相交,则将时间步长减半并开始递归。

一种二分查找,以发现有限交点的位置。


这里是OP。感谢你的贡献。我考虑采用与上面评论中提到的二分法类似的方法,虽然我相信必须有一个实际的数学方法可以直接找到确切的答案。现在我正在尝试2D公式,希望我能找到一个精确且快速的方法。 - x26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接