Answers:
抛物线形扇形函数定义为:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
已知值:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
未知值:
Vo: Initial Velocity
为了计算“ Vo”,我们可以给F函数赋值:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
现在,您可以从原点获得所有到达目标的值,将t的值赋给F方程:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
我最近不得不解决一个类似的问题,根据我在Wikipedia页面“ Dan the Man”上发现的公式,我提出了两个解决方案:弹丸的弹道
在此解决方案中,您可能确实需要固定发射角或x速度。由于我们以特定角度发射弹丸,因此不需要Y速度。
解决方案1,发射角固定,计算速度:
g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity
解决方案2,速度固定,计算发射角:
g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle
就我而言,这种解决方案效果很好。
如果您不在乎它在数学上是否正确,只需看一下它是否足够正确,就可以计算直线路径并让弹丸遵循该路径,但可以根据其向下的距离沿该直线的法线“向上推”线段,因此它在接近线段中间时会上升,而在远离线段中间时会下降。
为此,您可以使用正弦波,使用的范围是-90到+90(其中-90是线段的左点,90是右点,并且在中间弯曲),然后将结果相乘不断扩大规模。
如果您需要纯粹正确的数学/物理答案,这将无济于事。如果您不这样做,那么这可能对您很有效!
别忘了,游戏编程是要使用看起来正确的幻觉(并且计算起来更便宜),而不是真实感。
如果您只需要一些正确的东西并具有固定的速度,则可以使用这种非常简化的方法。
distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;
距离可以为负,但仍然可以使用,因为角度也取决于距离。如果距离为负,则需要增加的角度也为负。
您需要使用distanceFactor来找到正确的值。它取决于弹丸的重力和力量。它应接近1除以弹丸可覆盖的最大距离。