在抛物线路径上移动2D物理体,初始脉冲为统一

时间:2017-03-14 17:08:27

标签: unity3d 2d physics gravity

我有什么:

Unity 5 2D中受弹力影响的射弹,我想从A点移动到B点,在抛物线路径上有初始冲动

我所知道的:

  • 随机起始位置(A)的2D坐标
  • 随机目标位置(B)的2D坐标
  • 时间(X)我希望身体在
  • 之后到达目标位置

我想知道的事情:

  • 初始冲动(如同使用力模式冲动的统一应用力),我必须一次性施加到身体上,以便在X时间后到达所需的位置B.

备注:

  • 这是一个使用Unity 2D物理的2D世界
  • 两个位置A和B是完全随机的,可能是也可能不是相等的高度(y坐标)
  • 我只想在产生射弹时使用一次冲动
  • 除了GRAVITY之外,射弹没有任何影响他的其他力量(因为当前的问题让我们假设它总是以9.8的大小指向下方)

这是我想要的(坏)绘图:D enter image description here

先谢谢你们!

2 个答案:

答案 0 :(得分:4)

让我们解决一些更简单的问题。我们的目标是找到粒子的初始速度,而不是“冲动”,因为我们将通过这种方式实现更好的控制。

首先,考虑如何在没有Unity物理的情况下解决这个问题。粒子作为时间函数的位置取决于其初始位置,速度和加速度。无论您有多少维度,相同的公式都适用。这个等式是:

current_position = 1/2 * acceleration * time^2 + velocity * time + starting_position

current_position成为我们想要的目的地,time是您选择的旅行时长,starting_position是粒子的起始位置。

在x维度中,没有加速度。让X_0成为我们的起始X位置,X_1是我们的目的地,T是我们想要到达目的地的持续时间。我们想要找到v_x或x维度中的速度。为了便于解释,我将所有常量标记为大写,变量标记为小写。

  1. X_1 = v_x*T + X_0
  2. v_x = (X_1-X_0)/T
  3. 在y维度中,我们有某种引力。所以让我们把它作为我们的加速度:

    1. Y_1 = 0.5*G*T*T + v_y*T + Y_0
    2. v_y = (Y_1 - Y_0 - 0.5*G*T*T)/T
    3. 现在你有v_xv_y,只需设置速度:

      rigidbody2d.velocity = new Vector2(v_x, v_y);
      

      由于不同的物体具有不同的质量,因此您不想尝试计算冲动。只需在生成对象时将速度设置为帧中所需的速度。

      这与您在互联网上可能找到的建议相反,但先尝试,然后再做更复杂的事情。

      一些重要的注释:

      • Unity中的物理处理不稳定:您可能会在不同平台上获得不同的结果,尤其是在不同的移动设备之间。如果存在性能压力,可能会有较少的物理评估,因此结果不正确。这通常不是2D物理问题。
      • 您可能会遇到重力比例问题,具体取决于您的版本以及您拥有的其他设置。

答案 1 :(得分:3)

仅受重力影响的抛射物位置公式如下:

x = x0 + v_x0*t
y = y0 + v_y0*t + 0.5*g*t^2

所以,通过一些基本的计算来了解起始速度:

v_x0 = (x-x0)/t
v_y0 = (y-y0)/t + 0.5*g*t^2/t = (y-y0)/t - 4.9*t

现在,为了使用AddForce添加此启动速度,我们可以使用ForceMode.VelocityChange,但此模式仅适用于3D刚体,因此我们需要使用{{1}并将力乘以物体的质量:

ForceMode.Impulse

就是这样。

当然,您可以直接设置刚体的速度,而不是使用RigidBody2D rigid = GetComponent<RigidBody2D>(); rigid.AddForce(new Vector2 (v_x0, v_y0) * rigid.mass, ForceMode2D.Impulse);