【问题标题】:Projectile Motion in 3D: Calculating Time of Collision3D 中的弹丸运动:计算碰撞时间
【发布时间】:2020-07-31 05:36:37
【问题描述】:

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

【问题讨论】:

  • 如果所有 3 个轴的初始速度和加速度都相同,您可以只基于一个轴进行计算。我认为情况并非如此,因为我想象在 z 轴上你也应该有重力加速度。正在计算地面上的碰撞点吗?
  • 按组件进行,然后创建结果组件的向量。
  • @Eddymage 重力被忽略,但加速度是恒定的,并且可以(并且通常是)在所有三个轴上。但是,三个轴的初始速度和加速度是不同的。碰撞点只是一个简单的平面
  • @badcoder,你为什么要忽略弹丸中的重力加速度?如果不是重力,您所说的加速度是多​​少?
  • 抱歉,这样说不太好,有“重力”,但它可以在任何方向,而不仅仅是向下。这是唯一的加速。对不起,如果这听起来很奇怪

标签: c++ projectile kinematics


【解决方案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。然后使用上述公式计算碰撞坐标 x(t_c) 和 y(t_c),将 t 替换为 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 的解决方案(我放弃了 x, y 和 z 对 t 的依赖>)。

要在 C++ 中解决它,您可以搜索数学库,例如 Eigen,其中 module 用于非线性系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多