【发布时间】:2010-12-27 08:08:49
【问题描述】:
我正在编写一个物理引擎/模拟器,其中包含 3D 太空飞行、行星/恒星引力、船舶推力和相对论效应。到目前为止,一切进展顺利,但是,我需要帮助的一件事是碰撞检测算法的数学运算。
我使用的运动迭代模拟基本如下:
(注意: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) RE:效率,在确定可能的碰撞候选者方面,我不需要帮助(无论如何),我想我已经涵盖了。
另一个澄清,似乎经常出现:
3) 我的增量运动方程 (EQ.2) 是一个二次方程,它同时应用了速度和加速度:
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
在我见过的物理引擎中,(当然还有我听说过的所有游戏引擎)只有线性增量运动方程只应用速度:
obj.POS = obj.POS + (obj.VEL * dT)
这就是为什么我不能使用 StackOverflow、Wikipedia 和整个 Web 上常见的碰撞检测解决方案,例如找到两条线段的交点/最近的方法。我的模拟处理对结果至关重要的可变加速度,所以我需要的是两个 抛物线 线段的交点/最接近方法。
【问题讨论】:
标签: math 3d simulation physics collision-detection