我正在编写一个物理引擎/模拟器,其中包括三维空间飞行、行星/恒星引力、船只推力和相对论效应。到目前为止,进展非常顺利,但是我需要帮助解决的问题是碰撞检测算法的数学问题。
我使用的运动迭代模拟基本上如下:
(注意:3D向量全部大写。)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
场景:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
我需要做的基本上是从上面的方程式(EQ.2)中找到一些有效的公式,用于两个对象(obj1,obj2),并告知它们是否会发生碰撞,如果会,那么在何时发生。我需要确切的时间,以便我可以确定它是否在特定的时间增量内(因为不同的时间增量加速度也不同),同时也需要确定确切的位置(我知道如何做,只需给定时间)。
对于这个引擎,我将所有对象建模为球体,所有这个公式/算法需要做的就是找出在哪些点上:
(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)
.Distance 是一个正数标量值。(如果这样更容易,您也可以将两边平方,以避免.Distance计算中隐含的平方根函数)。
(是的,我知道有很多其他的碰撞检测问题,然而,它们的解决方案似乎都非常特定于它们的引擎和假设,并且没有一个符合我的条件:3D、球体和在模拟增量内施加的加速度。如果我错了,请告诉我。)
一些澄清:
1)在时间增量之前和之后检查两个球体的交集是不足够的。在许多情况下,它们的速度和位置变化将远远超过它们的半径。
2)关于效率,我不需要帮助(至少目前不需要)来确定可能的碰撞候选者,我认为我已经解决了这个问题。
另一个经常出现的澄清:
3)我的增量运动方程(EQ.2)是一个二次方程,适用于速度和加速度:
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
在我所见过的物理引擎中(当然还包括所有我听说过的游戏引擎),只有线性方程逐步运动应用于速度,没有其他类型的方程。
obj.POS = obj.POS + (obj.VEL * dT)
这就是为什么我不能使用在StackOverflow、维基百科和整个互联网上普遍发布的碰撞检测解决方案,例如找到两条直线段的交点/最近接触点。我的模拟涉及基本结果的可变加速度,因此我需要找到两个抛物线段的交点/最近接触点。