Unity真实榴弹炮模拟(真正的大型榴弹炮实现)

5 篇文章 0 订阅

上一篇传送门

前言

之前实现了一个按榴弹炮速度来计算发射仰角的博客,其效果不是很理想,虽然可以在给定炮弹速度的情况下可以将炮弹打到最远的地方,但是它的发射仰角被限制在了0 ~ 45°之间,这就类似于高中物理所学的抛物线运动了,它实际是两种运动的合运动,至于为什么是45°这也可以被证明,这里就不详细解释了,因为和这次所要介绍的算法没多大关系。

问题

不能越过太高的障碍物
如果按照上篇博文的算法,实现大炮后,你就会发现一个问题,就是炮弹无法越过太高的障碍物,因为它的发射仰角计算的时候就被限制在了0 ~ 45°,也就是说无法突破45°这个门槛,但让你改变的变量就只有,重力和速度,如果你改变重力,那么势必会影响游戏中其他运用到物理算法的游戏物体,而且更重要的是,会影响真实性。
那么加速呢?你的炮口会因为加速,而减小仰角,这很合理对不对,但这不是我们想要的结果,我们想要的结果是,炮弹可以越过障碍打到目标。

解决

为了解决这个问题,我们变换思路,如果影响我们的因素是告诉,那么,我们就可以把高度作为一个可变参数,让炮弹到达这个高度,在落下去,这样不就可以解决问题了吗?

物理知识

平抛运动:
把一个物体从一个高度抛出,指定其水平初速度和高度,求物体落到地面时候的速度为多少,以及其与地面的夹角?
在这里插入图片描述

首先我们已知的物理量有:
水平初速度,重力加速度,高度H
那么,我们就可以得到竖直方向的最终速度为
Vy = gt;
此时多了t这个位置数,但是我们知道高度和重力加速度g,所以可以求得下落时间为
t = Sqrt(2 * h / g);
我们求得了时间,所以Vy为:
Vy = g * Sqrt(2 * h / g);
水平速度是已知的,所以最终的落地速度为:
V落地 = Sqrt(Vy ^ 2 + V ^ 2);
求到了落地速度,就可以求得它与地面的夹角:
theta = ACOS(V / V落地);

应用到游戏

我们复习了高中的平抛运动,现在来把这个应用到实际游戏当中去:
我们要先了解,可以直接得到的物理量有哪些?

  1. 与目标的水平距离;
  2. 重力加速度g的大小。

嗯。。。看来就这么多信息,但是还有一个需要被我们指定的物理量,高度。
现在再来看看这道题:
已知与目标的水平距离,还有炮弹运动的高度以及重力加速度g的大小,求落地速度与地面的夹角大小,以及炮弹的速度大小?
在这里插入图片描述

不必想的太难,我们设水平速度为Vx,这样转换为了我们上一节所复习的知识。
根据抛物线运动的对称性,我们只看一半就好了,这时候我们已知的物理量有一个发生了变化,那就是与落地点或者目标的水平距离缩短为了原来的一半,也就是 S / 2,这很重要。
根据平抛运动,根据平抛运动,可以得到下落时间为:
t = Sqrt(2 * h / g);
又在水平方向,可以求得运动时间:
t = S / 2 / Vx;
这两个时间是等价的,所以联立它们,最终得到,Vx:
Vx = S * Sqrt(g / (8 * h));
我们根据,下落时间,也可以得到竖直方向速度,Vy:
Vy = gt;
所以得到合速度:
V = Sqrt(Vy ^ 2 + Vx ^ 2);
也可以求得对应夹角:
theta = ACOS(Vx / V);
这个夹角也是炮弹发射的仰角大小。

我们将算得的速度和夹角应用到对应的游戏物体上即可,至于炮弹运动的算法,在上一篇已经介绍过了。 这里就不详细说了,下面是实现代码:

void CountSpeed()
{
    float tempDis = Vector3.Distance(this.transform.position, target.position);
    float vSpeed = tempDis * Mathf.Sqrt(9.8f / (8.0f * bulletHeight));//水平速度
    float t = tempDis / (2 * vSpeed);//下落时间
    float hSpeed = t * 9.8f;
    //计算所得到的数据
    float speed = Mathf.Sqrt(Mathf.Pow(hSpeed, 2) + Mathf.Pow(vSpeed, 2));//真正速度
    float shotAngle = Mathf.Acos(vSpeed / this.speed) * Mathf.Rad2Deg;//求到夹
}

最后所求得得speed, shotAngle,分别是炮弹速度,和大炮仰角,将这两个数据应用到相应得代码中,就可以看到很真实的模拟效果
这时候高度为400
400发射高度
这时候高度为200
在这里插入图片描述

对没发炮弹都是精准打击,但是要注意,这里是默认发射点和目标在同一水平面上的,真实情况发射点和目标肯定是又高度差的,这里放在下一次详细解决。

最后

我希望大家如果读我的文章,在对我的文章提出问题的时候,提一些有意义的问题。比如我那一块怎么做会更好,那一块讲的不对,如果要对我的文章进行转载,请注明出处。本人2020年毕业,入行不到3个月,希望和大家共同进步。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值