2D 抛物线弹道问题

3
我想创建一个基本的JavaScript实现,使弹道沿着抛物线(或类似于抛物线)到达指定点。我在复杂数学方面不是很熟练,已经花了几天时间阅读相关问题的材料。不幸的是,对我来说看到数学解决方案相当无用。我最理想的情况是得到伪代码(甚至是现有的示例代码),以便更好地理解它。我找到的所有内容似乎只提供了问题的部分解决方案。
实际上,我要模拟箭从一个位置(弓的位置)飞到另一个位置。我已经通过在每个逻辑间隔更新其速度来模拟了重力对我的抛射物的影响。现在我要弄清楚的是,为了在最短的时间内到达目标,如何确定发射箭的正确弹道/角度。
非常感谢您的任何帮助。
2个回答

4
Pointy的回答很好地总结了如何模拟物体的运动,给定一个初始轨迹(其中轨迹被认为是一个“方向”和一个“速度”,或者是一个“向量”的组合)。
然而,如果我理解正确的话,你在问题中说你想确定只知道起点O和目标点P的“预期”轨迹。
坏消息是,在实践中,对于任何特定的P,都有无限多个抛物线轨迹可以从O到达P。角度和速度是相互依存的。
如果我们将所有内容转换为O位于原点(即[0, 0]),则:
T_x = P_x - O_x            // the X distance to travel
T_y = P_y - O_y            // the Y distance to travel

s_x = speed * cos(angle)   // the X speed
s_y = speed * sin(angle)   // the Y speed

那么在任何时间点 (t),位置(x,y) 为:

x = s_x * t
y = s_y * t - 0.5 * g * (t ^ 2)

在实际应用中,你需要处理的是

T_x = s_x * t
T_y = -0.5 * g * (t ^ 2) + s_y * t

但是你有三个未知数(ts_xs_y)和两个同时方程。如果你确定其中一个,就足以解决这些方程。

顺便说一下,确定s_xs_y等同于确定speedangle,这只是简单的三角学。

当然,有些组合是不可能的 - 如果速度太低或角度太高,弹丸会在到达目标之前撞击地面。

注意:这假设位置是连续评估的。它与时间以离散增量过去的情况不完全匹配,根据Pointy的答案和您自己对如何模拟运动的描述。如果您足够频繁地重新计算位置(即每秒10次),则应该足够准确。


其他人总是比我更擅长阅读问题。 :( - Pointy
明白了。我想我的问题实际上是:为了在最短的时间内击中目标,我如何确定发射抛射物的最佳角度/轨迹? - ndg
2
@ndg:如果没有其他限制,解决方案就是直接瞄准目标并以无限速度射击。如果速度有上限,最快的解决方案将始终是以那个速度射击(这不仅会产生最快的箭头,而且会产生最短的弹道),因此现在您可以解决角度问题。 - Andrzej Doyle

4
我不是物理学家,所以我只能告诉你一个基于非常简单过程的方法。
1.您的“箭头”有“x”和“y”坐标以及“vx”和“vy”速度。箭头的初始位置是初始的“x”和“y”。初始的“vx”是箭头的水平速度,“vy”是垂直速度(实际上是速度,但那只是字)。这两个值的概念上取决于射箭手射箭时使用的角度。
2.您将使用离散计算在离散时间间隔内模拟时间的进展。您不必担心“平滑”的轨迹弧线方程。因此,您将运行计时器并每100毫秒(或任何您想要的间隔)计算更新的位置。
3.在每个时间间隔,您将向“x”添加“vx”和“y”添加“vy”。 (因此,请注意,“vx”和“vy”的初始选择与您选择的时间间隔相关联。)您还将更新“vx”和“vy”,以反映重力和(如果您愿意)风的影响。如果“vx”不变,则基本上模拟在月球上射箭:-) 但是,由于重力的影响,“vy”会改变。每次时间间隔减去一个恒定量即可。称之为“delta vy”,您将不得不根据所需的效果调整值以获得正确的值。 (数学上,“vy”就像第一导数的“y”分量,而“delta vy”值是第二导数。)
4.因为您每次都会向“vy”添加一个小量,所以递增变化将累加,从而正确模拟了箭头在屏幕上移动时的“重力彩虹”。
现在您需要解决的一个细节是“vy”的符号。 “vy”的初始符号应该与“delta vy”的相反。哪个应该是正的,哪个应该是负的,取决于坐标网格与屏幕的关系。
编辑-有关您的问题实际上相关的内容,请参见@Alnitak的答案。

Pointy:感谢您的解释。我应该在最初的问题中提到,我已经用速度向量模拟了箭头的移动,并在每个逻辑时钟周期更新它以表示重力作用。 - ndg
没问题。就像我对@Alnitak说的那样,我在仔细阅读问题方面不太擅长。 - Pointy
不需要道歉。我很感激你抽出时间来帮助我。 - ndg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接