2d抛物线弹丸

时间:2011-03-10 15:58:21

标签: javascript physics game-physics

我正在寻找一个抛物线的基本Javascript实现,它遵循一个抛物线弧(或接近一个的东西)到达一个特定的点。在复杂的数学方面我并不是特别精通,而且花了几天时间阅读有关问题的材料。不幸的是,看到数学解决方案对我来说毫无用处。我理想地寻找伪代码(甚至现有的示例代码)来试图理解它。我发现的一切似乎只能为问题提供部分解决方案。

实际上,我希望模拟箭头从一个位置(弓的位置)到另一个位置的飞行。我已经通过在每个逻辑间隔更新其速度来模拟重力对我的射弹的影响。我现在要弄清楚的是,我是如何找出正确的轨迹/角度来射箭,以便在最短的时间内达到我的目标。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

我不是物理学家所以我所能做的就是告诉你一种基于非常简单的过程的方法。

  1. 您的“箭头”有一个“x”和“y”坐标,以及“vx”和“vy”速度。箭头的初始位置是初始“x”和“y”。最初的“vx”是箭头的水平速度,最初的“vy”是垂直速度(井速确实,但那些只是单词)。从概念上讲,这两者的值取决于你的弓箭手在射箭时使用的角度。
  2. 您将以离散的时间间隔模拟离散计算的时间进度。您不必担心“平滑”轨迹弧的方程。因此,您将运行计时器并每100毫秒(或您想要的任何间隔)计算更新的位置。
  3. 在每个时间间隔,您要将“vx”添加到“x”,将“vy”添加到“y”。 (因此,请注意,“vx”和“vy”的初始选择与您选择的时间间隔有关。)您更新“vx”和“vy”以反映效果重力和(如果你喜欢的话)风。如果“vx”没有改变,你基本上模拟在月球上射箭:-)但是“vy”会因为引力而改变。该变化应该是每个时间间隔减去的常数。称之为“delta vy”,你必须修改一些东西,根据你想要的效果获得正确的值。 (数学方面,“vy”类似于一阶导数的“y”分量,“delta vy”值是二阶导数。)
  4. 因为您每次都会向“vy”添加一小部分,所以增量变化会加起来,当箭头在屏幕上移动时正确模拟“重力的彩虹”。
  5. 现在你需要解决的一个细微差别是“vy”的标志。 “vy”的初始标志应与“delta vy”相反。哪个应该是正数,哪个应该是负数取决于坐标网格与屏幕的关系。

    编辑 - 请参阅@ Alnitak的回答,了解与您的问题密切相关的内容。

答案 1 :(得分:4)

Pointy的答案很好地总结了如何在给定初始轨迹的情况下模拟物体的运动(其中轨迹被认为是方向,以及速度 ,或组合使用 vector )。

但是你在问题中说过(如果我没有正确读到你)你想要确定初始轨迹,只知道原点O目标目标点P

坏消息是,在任何特定P的实践中,都会有无数个抛物线轨迹从O到达那里。角度和速度是相互依赖的。

如果我们翻译所有内容以便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

然后,任何时间点(x, y)的位置(t)为:

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)和两个联立方程式。如果你修复其中一个,那就足以解决方程式。

FWIW,修复s_xs_y相当于修复speedangle,这一位只是简单的三角函数。

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

注意:这假定持续评估的位置。根据Pointy的回答以及您自己对模拟运动的描述,它与离散增量的时间过去时发生的情况不太匹配。如果你足够频繁地重新计算位置(即每秒10次),它应该足够准确。