弹道曲线问题

Rav*_*ven 12 c++ physics

好吧,我知道这对于程序员来说是非常偏离主题但我仍然需要这个应用程序,所以这里是:

弹道曲线(无风或任何其他条件)由以下两条线指定:

x坐标

y坐标

因此,存在一个问题,即您有3个未知值:x,y和时间t,但只有2个方程式.你不能用这些值真正计算所有3,我得到:

  • 速度v
  • 角度Alpha
  • 原点坐标

因此,您必须决定指定哪一个.

现在你有2D坦克游戏,或类似的东西,你知道你有坦克和使用弹道,你必须用设置角度和力量射击对手.

我需要知道子弹何时撞到地面,它可以在飞行时或预先计算时播出.出现了我的问题.哪种方式使用?在每个步骤中预先计算或检查是否击中地面.

如果我想预先计算,我需要知道地形的高度,这在逻辑上必须是恒定的,因为我不知道在哪个x坐标.如果我知道X,那就意味着我的炮塔前面就是墙.因此,当我到达地面时,唯一可以获得结果的方法是检查击中地面的时间间隔.这也很好,因为地形没有顶部静态yay!但这不是太大的开销,可以变得更简单吗?你遇到过这样的问题/解决方案吗?

提前谢谢,顺便说一下,地形可以是扁平的,使用线条或NURBS,所以我请求一般的解决方案,而不是特定的,因为你拍摄的高度会影响.

Dav*_*d Z 17

您可以y(x)通过求解一个等式t并代入另一个等式来计算射弹的路径.你得到

y = x tan(θ) -  x ^ 2g/2(v cos(theta))^ 2

然后找到着陆点是计算该函数与定义地形高度的函数之间的交叉点的问题.一个交叉点将是发射点,另一个交叉点将是着陆点.(如果你的地形非常陡峭和丘陵,那么可能会有两个以上的交叉点,在这种情况下,你可以使用x大于启动点的第一个交叉点.)你可以使用各种寻根算法来实际计算交叉点; 检查您必须查看的数学或游戏物理库的文档是否提供了执行此操作的方法.


小智 6

David Zaslavsky很好地回答了关于求解方程式的问题,但如果你的最终目标是简单的弹道学模拟,我建议你使用向量分解.

通过利用矢量分解,您可以推导出射弹的x和y能力矢量.然后,您可以对每个组件应用加速度以考虑重力,风等.然后您可以将每个间隔的射弹(x,y)位置更新为时间的函数.

例如:

double Speed = 100.0;     // Speed rather than velocity, as it is only the magnitude
double Angle = 30.0;      // Initial angle of 30º
doulbe Position[2] = {0.0,0.0};  // Set the origin to (0,0)

double xvelocity = Speed * Cos(Angle);
double yvelocity = Speed * Sin(Angle);
Run Code Online (Sandbox Code Playgroud)

然后,如果您可以按如下方式实现简单的更新功能:

void Update(double Time)
{
     yvelocity = -9.8 * Time; // Apply gravity

     Position[0] *= (xvelocity * Time);  // update x position
     Position[1] *= (yvelocity * time);  // update y position

     CheckCollisions();  // check for collisions
}
Run Code Online (Sandbox Code Playgroud)

当然这是一个非常基本的例子,但你可以从这里开始构建它.


Car*_*icz 5

幸运的是,这是非常简单的运动学.

这些方程是参数化的:对于任何给定的时间t,它们为您提供该时间的x和y坐标.您需要做的就是插入起始速度v和角度a.

如果你在水平地面上工作,你的射弹返回的时间就是2sin(a)v/g,即你的速度的垂直分量除以重力引起的向下加速度.2是因为速度降低到0需要花费这么多时间,然后再次加速回落.一旦你知道你可以解决x的时间.

如果你的地形不平坦,你还有一些额外的乐趣.你可以试试的是找出在相同高度撞击地面的时间,然后校正额外的垂直距离.这也会改变你的水平距离,这可能会再次影响你的身高......但是两三次调整和错误太小,人类无法注意到:)