0

我正在编写一个函数,该函数在 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

4

1 回答 1

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。求解方程_

z(t) = k

用于找到弹丸击中飞机的时间 t_c。然后使用上面的公式计算碰撞坐标x(t_c)y(t_c) ,用t_c代替t

如果平面有一般方程

斧头 + 由 +cz + 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

斧头 + 由 +cz + d = 0

采用t>0的解决方案(我放弃了对tx、yz的依赖)。

要在 C++ 中解决它,您可以搜索数学库,例如具有非线性系统模块的Eigen 。

于 2020-07-31T07:08:45.197 回答