基于XYZ坐标系的3D运动球体碰撞时间计算公式求解
3D运动球体碰撞时间计算推导
核心思路
- 两个球体发生碰撞的充要条件:t时刻两球心的距离 ≤ 两球半径之和
- 通过相对运动转化可以将问题简化为一元二次方程求解,不需要迭代计算
变量定义
统一参数记法如下:
- 物体1初始位置矢量:$\vec{P_1} = (x_1, y_1, z_1)$,速度矢量:$\vec{V_1} = (V_{x1}, V_{y1}, V_{z1})$,碰撞半径$r_1$
- 物体2初始位置矢量:$\vec{P_2} = (x_2, y_2, z_2)$,速度矢量:$\vec{V_2} = (V_{x2}, V_{y2}, V_{z2})$,碰撞半径$r_2$
- 初始相对位置矢量:$\vec{dP} = \vec{P_1} - \vec{P_2}$
- 相对速度矢量:$\vec{dV} = \vec{V_1} - \vec{V_2}$
- 两球刚好接触的临界距离:$R = r_1 + r_2$
公式推导
t时刻两球的位置分别为:
$\vec{P_1}(t) = \vec{P_1} + \vec{V_1} * t$
$\vec{P_2}(t) = \vec{P_2} + \vec{V_2} * t$
碰撞时满足距离条件:
$|\vec{P_1}(t) - \vec{P_2}(t)| \leq R$
两边平方消去根号(模长平方等于矢量自身点积):
$(\vec{dP} + \vec{dV} * t) \cdot (\vec{dP} + \vec{dV} * t) \leq R^2$
展开后得到标准一元二次方程:
$a * t^2 + b * t + c = 0$
三个系数计算规则:
- $a = \vec{dV} \cdot \vec{dV}$:相对速度的模长平方
- $b = 2 * (\vec{dP} \cdot \vec{dV})$:初始相对位置和相对速度点积的2倍
- $c = |\vec{dP}|^2 - R^2$:初始相对距离平方减去半径和平方
结果判定逻辑
按一元二次方程的解的情况分类判断:
- 当$a = 0$时:
说明两球相对静止,若$c \leq 0$则初始时刻已经碰撞,返回$t=0$;若$c>0$永远不会碰撞,返回No collision - 当$a > 0$时:
先计算判别式$D = b^2 - 4ac$- 若$D < 0$:方程无实根,两球运动轨迹没有交点,返回
No collision - 若$D \geq 0$:计算两个实根 $t_1 = \frac{-b - \sqrt{D}}{2a}$,$t_2 = \frac{-b + \sqrt{D}}{2a}$($t_1 \leq t_2$)
- 若$t_2 < 0$:两次碰撞都发生在测试开始之前,当前不会碰撞,返回
No collision - 若$t_1 \leq 0$:测试开始时两球已经处于碰撞状态,返回$t=0$
- 若$t_1 > 0$:首次碰撞时间为较小的根$t_1$,保留三位小数即可匹配示例结果
- 若$t_2 < 0$:两次碰撞都发生在测试开始之前,当前不会碰撞,返回
- 若$D < 0$:方程无实根,两球运动轨迹没有交点,返回
注:你给出的第二个示例存在输入笔误,正确参数应为v(2)=(-4,3,-10)、r(2)=6,修正后代入计算得到的结果和标注的0.492完全一致。
内容的提问来源于stack exchange,提问作者Vahid Najafi
相关产品推荐
相关产品推荐

