我想使用加速算法来改变所谓的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;
我想在代码中创建它以及一个将速度提高百分比的加速方法。 所以我的问题是如何将速度作为一种参考点。
答案 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);