[游戏开发]抛物线弹道计算

2024-01-07 18:25:00

游戏中常见的抛物线形式有两种

1:平抛运动,例如弩车

2:投石车、弓箭手斜抛运动

在实际开发中,我们还会遇到两种不同的情况

  1. 第一种是射击目标坐标已知(例如阴阳师那种回合制战斗游戏,弓箭手向固定坐标射一箭,可以用贝塞尔曲线模拟一个假的弹道就行了,箭的旋转方向就是贝塞尔曲线的切线方向)
  2. 第二种是射击目标坐标未知(弓箭手拉弓,向上抬?角度,射一箭,具体射谁我也不知道,这种情况下就需要实时计算弓箭的位置和朝向)

第一种情况直接用二次贝塞尔曲线搞定

下面重点说一下无目标抛物线射击

在游戏中,我们需要知道每一帧箭的位置,以及朝向,然后刷新子弹的坐标和旋转,但我们已知的数据只有初始速度,射击角度,重力,还有一个很重要的自变量运行时间

下面下给出二维情况下运行时间t和高度y的对应关系

//Vo射击方向的初速度
//t子弹经过总时长
//g重力

y = Vo * Sin? * t - 1/2 * g * t2?

根据以上公式,可以推导出任意时刻子弹的高度y

还可以判断出子弹何时落地,y = 0,即?Vo * Sin? * t - 1/2 * g * t2 = 0

除了t剩下的都是常熟,可以解出t的值

计算二维抛物线轨迹

?上面的公式只解决了部分问题,在游戏计算中需要的是三维坐标,而y只求出来高度,把问题先简单化,我们先计算物体在二维平面上的运动轨迹

不考虑向前的风阻,弓箭向前的速度Vx始终是恒定的,也就是说,根据路程=时间*速度公式,炮炮弹X轴坐标?= Cosθ * V * 炮弹飞行时间

炮弹Y轴坐标=??V?* Sin? * 炮弹飞行时间 - 1/2 * 9.8?*?炮弹飞行时间平方

有了X轴和Y轴坐标,那么炮弹的二维轨迹已经有了

?接下来剩下一个问题就是二维轨迹转三维轨迹

二维坐标转三维

我们先思考一下,炮弹的运动方向和谁有关?一定是发射它的物体,下图是投石车,前面的小人是正方向。

还是以投石车为例,炮弹的运动轨迹就是把红轴替换成二维的X轴,蓝轴替换成二维的Y轴在运动,不需要考虑绿轴(Unity和UE的坐标系不一样,我就以颜色来代替轴)

接下来我们如何利用已知的向量和坐标实时计算发射物的坐标和朝向?

目前有两个思路:

思路1:先计算抛射物二维坐标,二维变三维,三维坐标绕纵轴旋转,与发射坐标累加

  1. 假设抛射物飞行了t时间,那么二维空间下的坐标(Xt,Yt)我们可以计算得出
  2. 二维坐标Xt Yt加一个维度Z,Z?= 0,得到三维坐标(Xt,Yt,Z)
  3. (Xt,Yt,Z)三维坐标沿蓝轴旋转一定角度和投石车朝向一致,得到旋转后的(X,Y,Z)坐标
  4. (X,Y,Z)+投石车世界坐标 = 抛射物当前坐标

思路2:拿到发射朝向,计算发射方向与垂直轴所在平面的三维坐标,最后再累加发射坐标。

如何在平面内计算三维坐标点这个计算有点复杂,我还没实验。

文章来源:https://blog.csdn.net/liuyongjie1992/article/details/135409276
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。