根据加速度移动对象

时间:2014-04-04 14:40:19

标签: java performance math

我想使用加速算法来改变所谓的aicraft的速度,以便在2D环境中移动它。例如:

positionX = positionX + (speed based on acceleration);
positionY = positionY + (speed based on acceleration);

我的问题是,如果我这样做,结果,假设速度为50,将是位置+ = 50,这是完全错误的,因为我不想使用速度作为它将移动的X的数量在轴上。我希望速度是轴数的某种基础。 例如,如果让我们说速度是50而50速度意味着每次移动3 X那么这意味着

positionX + speed = positionX+3;

我想在代码中创建它以及一个将速度提高百分比的加速方法。 所以我的问题是如何将速度作为一种参考点。

3 个答案:

答案 0 :(得分:3)

保持简单。物理学并不困难。 “数学”并不比乘法和加法困难。

您希望在时间增量上处理速度和位置的变化。

位置,速度和加速度是矢量。在2D世界中,这意味着每个人都有一个x方向和y方向的组件。

所以如果你增加时间:

t1 = t0 + dt

如果速度在该时间增量dt:

上保持不变,您的位置将会改变
(ux1, uy1) = (ux0, uy0) + (vx0*dt, vy0*dt)

如果加速度在该时间增量dt:

上保持不变,速度将会改变
(vx1, vy1) = (vx0, vy0) + (ax0*dt, ay0*dt)

如果使用牛顿定律涉及力量,请更新加速度:

(ax0, ay0) = (fx0/m, fy0/m) 

其中m是身体的质量。

在时间步结束时更新位置,速度和加速度并重复。

这假设在步骤开始时使用加速度和速度值足够准确。这将限制您相对较小的时间步长。 (它被称为“显式集成”。)

这是一个例子。你有一个大炮在(x,y)=(0,0),里面有一个质量为20 lbm的炮弹。大炮从水平方向向上倾斜30度。我们会忽略空气阻力,因此在x方向上没有作用在炮弹上的力。只有重力(-32.2英尺/秒^ 2)才会在y方向上起作用。

当大炮熄火时,它将以40英尺/秒的初始速度发射炮弹。 (vx,vy)分量为(40 * cos(30度),40 * sin(30度))=(34.64英尺/秒,20英尺/秒)

因此,如果你插入方程式的时间步长为0.1秒:

(ax0, ay0) = (0, -32.2 ft/sec^2)
(vx1, vy1) = (vx0, vy0) + (ax0, ay0)*dt = (34.64 ft/sec, 20 ft/sec) + (0, -3.22 ft/sec) =  (34.64, 16.78)
(ux1, uy1) = (ux0, uy0) + (vx0, vy0)*dt = (3.464 ft, 1.678 ft)

以这些值为开始,再进行0.1秒的时间步。冲洗,重复......

您可以分别为x轴和y轴执行此操作。

通过使炮弹的初始高度等于炮轮直径的一半,你可以使这更加真实。

您可以在x方向上添加一个小的负加速度来模拟风阻。

假设您的目标沿x轴向右偏移。

如果你用大炮直接向上射击,方程式将显示球向上,在它到达顶点时减速,然后直接向下。没有打击,除了你的头和大炮。

如果你用大炮水平射击,方程式说球在x方向上以恒定速度移动并且只落在大炮的初始高度。你的敌人会嘲笑你:“空气球!空气球!”

因此,如果您希望球在目标位置的某个爆炸半径范围内与地面(也就是到达位置y = 0)相交,则必须使用初始速度和大炮从水平方向的角度来玩

答案 1 :(得分:1)

您只需要使用每个轴的运动方程:

x(t)= x0 + v0 * t + 1/2 * a * t ^ 2#其中x0是初始位置,v0是初始速度,a是你考虑的加速度,都是相对于轴的

现在您需要定义计算位置的时刻,以及以@markusw建议的正确单位写出速度和加速度的值。

答案 2 :(得分:-1)

像这样:

double calculateSpeed(double value) {
  return value / 16.66;
}

并称之为:

positionX = positionX + calculateSpeed(50);