计算抛物线弧中击中目标所需的最小射弹速度


Answers:


15

抛物线形扇形函数定义为:

   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)      

好答案。只是意识到g没有签名。随着g的增加,Voy也应该增加。
milkplus 2014年

如何知道t(影响所需的时间)?
Dewald Swanepoel 2015年

13

我最近不得不解决一个类似的问题,根据我在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

就我而言,这种解决方案效果很好。


2

如果您不在乎它在数学上是否正确,只需看一下它是否足够正确,就可以计算直线路径并让弹丸遵循该路径,但可以根据其向下的距离沿该直线的法线“向上推”线段,因此它在接近线段中间时会上升,而在远离线段中间时会下降。

为此,您可以使用正弦波,使用的范围是-90到+90(其中-90是线段的左点,90是右点,并且在中间弯曲),然后将结果相乘不断扩大规模。

如果您需要纯粹正确的数学/物理答案,这将无济于事。如果您不这样做,那么这可能对您很有效!

别忘了,游戏编程是要使用看起来正确的幻觉(并且计算起来更便宜),而不是真实感。


7
回复:我一般都同意“使用看起来正确(并且计算便宜)的幻觉”,但是在这种情况下,考虑到使用数学上正确的抛物线弧是多么容易和便宜,这似乎有点愚蠢。
内森·里德

1
没错,这似乎是不必要的简化,但我认为这个答案从坏的意义上讲不是不好的,也不值得下注(即使它不值得很多下注)。

实际上,如果您要使用正弦波,则应为0到180(或以弧度为0到pi)
Daniel Kaplan 2014年

2

如果您只需要一些正确的东西并具有固定的速度,则可以使用这种非常简化的方法。

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除以弹丸可覆盖的最大距离。


1
当心。当我尝试使用您的代码时,您会背弃cos和sin。我已经编辑了您的代码,所以它应该是正确的。
MrValdez 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.