Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 二维抛物面弹丸_Javascript_Physics_Game Physics - Fatal编程技术网

Javascript 二维抛物面弹丸

Javascript 二维抛物面弹丸,javascript,physics,game-physics,Javascript,Physics,Game Physics,我希望创建一个投射物的基本Javascript实现,该投射物沿着抛物线弧(或接近抛物线的东西)到达特定点。当涉及到复杂的数学问题时,我不是特别精通,我花了好几天时间阅读关于这个问题的材料。不幸的是,看到数学解对我来说毫无用处。理想情况下,我正在寻找伪代码(甚至是现有的示例代码)来尝试了解它。我所发现的一切似乎都只能部分解决这个问题 实际上,我希望模拟箭头从一个位置(弓的位置)到另一个位置的飞行。我已经模拟了重力对我的射弹的影响,通过在每个逻辑间隔更新它的速度。我现在想弄清楚的是,为了在尽可能短的

我希望创建一个投射物的基本Javascript实现,该投射物沿着抛物线弧(或接近抛物线的东西)到达特定点。当涉及到复杂的数学问题时,我不是特别精通,我花了好几天时间阅读关于这个问题的材料。不幸的是,看到数学解对我来说毫无用处。理想情况下,我正在寻找伪代码(甚至是现有的示例代码)来尝试了解它。我所发现的一切似乎都只能部分解决这个问题

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


任何帮助都将不胜感激。

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

  • 您的“箭头”具有“x”和“y”坐标,以及“vx”和“vy”速度。箭头的初始位置为初始“x”和“y”。初始的“vx”是箭头的水平速度,初始的“vy”是垂直速度(井速真的,但这些只是文字)。从概念上讲,这两个值取决于弓箭手在射箭时使用的角度
  • 您将以离散时间间隔通过离散计算模拟时间的进程。您不必担心“平滑”轨迹圆弧的方程。因此,您将运行一个计时器,每100毫秒(或您想要的任何时间间隔)计算一次更新的位置
  • 在每个时间间隔中,您都要将“vx”添加到“x”,将“vy”添加到“y”。(因此,请注意,“vx”和“vy”的初始选择与时间间隔的选择有关。)您还将更新“vx”和“vy”以反映重力和(如果您愿意)风的影响。如果“vx”没有改变,你基本上是在模拟在月球上射箭:-)但是“vy”会因为重力而改变。这种变化应该是在每个时间间隔上减去一个常量。称之为“delta-vy”,你将不得不根据你想要的效果进行修补,以获得正确的值。(数学上,“vy”类似于一阶导数的“y”分量,“delta vy”值是二阶导数。)
  • 因为你每次都会在“vy”中添加一小部分,所以增量变化会累积起来,正确地模拟了箭头在屏幕上移动时的“重力彩虹”
  • 现在你需要弄清楚的一个细微差别是“vy”的符号。“vy”的初始符号应与“delta vy”相反。哪个应该是正的,哪个应该是负的,这取决于坐标网格与屏幕的关系


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

    Pointy的答案是如何模拟给定初始轨迹(轨迹被视为方向、速度或矢量组合)的对象运动的一个很好的总结

    但是,您在问题中已经说过(如果我没有看错的话),您想要确定初始轨迹,只知道原点
    O
    和目标的预定点
    p

    坏消息是,在实践中,对于任何特定的
    p
    ,都会有无限多条抛物线轨迹将你从
    O
    带到那里。角度和速度是相互依存的

    如果我们翻译所有内容,使O位于原点(即[0,0]),则:

    然后,在任何时间点的位置
    (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
    
    但是你有三个未知数(
    t
    sux
    suy
    )和两个联立方程。如果你解决了其中一个问题,那就足以解决这些方程了

    FWIW,固定
    s_x
    s_y
    相当于固定
    速度
    角度
    ,该位只是简单的三角函数

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


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

    别人总是比我更善于阅读问题(这是可以理解的。我想我的问题真的是:为了在最短的时间内击中目标,我如何确定射弹的最佳角度/弹道?@ndg:没有任何其他限制,解决方案是直接瞄准目标,以无限的速度发射。速度有上限,最快的解决方案总是fir以这种速度飞行(这不仅会产生最快的箭头,而且会产生最短的轨迹),现在你可以解出角度点了:谢谢你的解释。我应该在我的原始问题中提到,我已经用一个速度向量模拟了箭头的运动,这个速度向量在每个逻辑刻度上都会更新,以表示引力。好的。就像我对@Alnitak说的,我不太擅长彻底地阅读问题。不需要道歉1.我感谢你抽出时间来帮忙。
    T_x = s_x * t
    T_y = -0.5 * g * (t ^ 2) + s_y * t