3

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

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

任何帮助将不胜感激。

4

2 回答 2

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”分量,而“
  4. 因为您每次都在“vy”中添加少量,增量变化会加起来,当箭头在屏幕上移动时正确模拟“重力彩虹”。

现在你需要解决的一个细微差别是“vy”的标志。“vy”的初始符号应该与“delta vy”相反。哪个应该是正的,哪个应该是负的取决于坐标网格与屏幕的关系。

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

于 2011-03-10T16:07:50.113 回答
4

Pointy 的回答很好地总结了如何在给定初始轨迹的情况下模拟物体的运动(其中轨迹被认为是一个方向和一个速度,或者是一个向量的组合)。

但是,您在问题中说过(如果我没看错的话)您想确定初始轨迹,只知道原点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_xors_y相当于固定speedor angle,那个位只是简单的三角函数。

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

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

于 2011-03-10T16:16:18.520 回答