3D弹丸运动:计算碰撞时间

时间:2020-07-31 05:36:37

标签: c++ projectile kinematics

我正在编写一个函数,该函数在3D空间中接收具有轨迹(包括起始位置,起始速度和加速度,均表示为Vector3s)的对象,如果碰到另一个对象,则返回碰撞点和时间的碰撞。我使用带有时间步长的运动方程来检测可能发生的碰撞,并且可以通过这种方式获得碰撞点,但是一旦有了碰撞点,我想找到发生碰撞的确切时间。我想到了重新安排运动方程解决时间并插入我已经拥有的东西,但是我不知道如何使用所有三个运动轴来做到这一点,因为我的其他值是Vec3,而时间只是标量。我曾考虑过只在一个轴上进行计算,但是不确定是否会导致准确的结果。

仅基于一个轴进行计算是否准确,或者是否可以将所有三个轴合并到计算中?我用来求解时间的公式是:

t = (v_init +/- Sqrt((v_init)^2 - (accel * disp * 4 * .5)))/accel;

其中v_init是初始速度,disp是总位移,而accel是加速度。我基于运动学方程式:

d = v * t + .5 * a * t ^ 2

1 个答案:

答案 0 :(得分:1)

让我写一般情况。分量运动定律是

x(t)= x0 + v_x t + 0.5 a_x t ^ 2

y(t)= y0 + v_y t + 0.5 a_y t ^ 2

z(t)= z0 + v_z t + 0.5 a_z t ^ 2

其中(x0,y0,z0)^ t 是初始位置,(v_x,v_y,v_z)^ t 是初始速度矢量,而(a_x,a_y,a_z)^ t 是加速度的向量。后者的第三部分可能还包括重力加速度。

我假设碰撞平面是水平的,因此方程式 z = k 。求解 t 方程

z(t)= k

用于查找弹丸击中飞机的时间t_c。然后使用上述公式,用 t 替换为 t_c x(t_c) y(t_c) >。

如果飞机有通用方程式

a x + b y + c z + d = 0

我建议将参照系放在平面上,使xy平面位于碰撞平面上,然后执行上述步骤。

您也可以解决非线性系统

x = x0 + v_x t + 0.5 a_x t ^ 2

y = y0 + v_y t + 0.5 a_y t ^ 2

z = z0 + v_z t + 0.5 a_z t ^ 2

a x + b y + c z + d = 0

采用 t> 0 的解决方案(我放弃了 t x,y z )。

要在C ++中解决该问题,您可以搜索数学库,例如Eigen,该库具有用于非线性系统的module