打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
实现火炮自动弹道计算
玩过战舰世界的玩家都能体会到,战舰世界那种玩家视角旋转与炮塔旋转相互独立的控制方法十分的适合战舰这类拥有巨大数量舰炮的单位。具体的控制是由玩家控制视野,用视野的中心来定位炮击位置,而炮塔则会自动转向玩家瞄准的方向,炮管也会自动的升到计算好的炮击仰角。接下来就将介绍在Unity中实现这种控制方法的过程。
一、视野控制
控制视野的移动十分简单,在摄像机上附加一个能够根据输入进行旋转的脚本即可。除此之外,为了后面进行炮击位置测定,也要在这个摄像机的脚本上添加一个射线碰撞检测,由屏幕中央向游戏中射线,在检测到地面时,返回碰撞点的坐标,提供给炮塔。
二、炮塔控制
比起视野控制,炮塔控制就显得复杂得多。由于炮塔的射击角度并不是由玩家决定,而是由电脑计算得出,所以这里还需要一个瞄准目标的解决方案。这里分为两个部分来解决,水平旋转和垂直旋转。
1.水平旋转
水平旋转主要由炮塔本体进行关于y轴的旋转,最终的方向是面向炮击点。这里使用了一个简单的计算方法,使用一个一直面向炮击点的辅助物体来确定正确的localEulerAngles,再获取这个值应用给炮塔。这样炮塔就可以确定向哪个方向开炮了。
2.垂直旋转
垂直旋转是最复杂的一步,这里忽略炮弹在飞行中的空气阻力来简化计算过程。
由于炮弹在空中做斜抛运动,我们可以使用抛物线方程来建立炮弹在射击面上的运动图像。
将t用x表示,并带入y的表达式,消去变量t。再经过简单的代数变化,能够化为下面的等式:
利用求根公式,可以得到如下公式:
可以再进行一步化简,得到最终公式:
在代码中可以轻松实现这个公式的计算,由于炮弹发射时我们已经知道初速度v0,重力加速度g,炮弹落点在该坐标系中的x,y坐标,计算θ角只需要带入值即可。
计算部分代码如下:

[code]csharpcode:

	float delta = Mathf.Pow(velocity, 4) - gravityAcceleration * (gravityAcceleration * x * x - 2 * y * velocity * velocity);        if (delta < 0)        {            Debug.Log("无法命中!");            return;        }        float theta1 = Mathf.Atan(((velocity * velocity) + Mathf.Sqrt(delta)) / (gravityAcceleration * x));        float theta2 = Mathf.Atan(((velocity * velocity) - Mathf.Sqrt(delta)) / (gravityAcceleration * x));        float angle = Mathf.Min(theta1, theta2);
如果Δ大于0,那么会有一大一小两个有效角度,可以根据需求选择较大的角或者较小的角来实现较高的弹道和较低的弹道。
如果Δ等于0,这个唯一的解是45°,也就是理论上的极限射程。
如果Δ小于0,说明目标地点已经处于炮击射程之外,无论以多大的射击仰角都无法击中目标。
值得一提的是,Unity中提供的Mathf.Atan()函数返回的是弧度值,我们还要经过弧度到角度转换才能将其应用到炮管的仰角上。

注意:如果将计算出的角度直接应用到炮塔上,会发现角度并不正确,当目标明显需要仰起炮管才能命中时会看到炮管向下旋转,并不能正确命中目标。经过观察和测试,发现了问题所在。Unity中x轴的旋转,在x轴正方向上看向坐标系原点这个视野中是顺时针的,换句话说,当x轴旋转为30°时,炮管将向下旋转30°,旋转330°才是向上旋转30°。所以在处理旋转角度时,还要进行一个倒数的处理,才能让炮管转向正确的方向。由此也引导我发现了另外一个问题——抛物线所在坐标系的方向也不是我们猜想的y轴与世界坐标系y轴正方向相同,而是相反。我们带入坐标后真正计算的抛物线图像是会直接穿过地面,经过端距离再回到地面上的,与我们想要的弹道恰恰关于地平面对称。这也说明我们带入公式计算的y值,应该是一个与实际情况相反的值才能符合抛物线图像。

故在使用上述方法时,需要带入的几个值,x为炮弹起始位置到落点位置的平面距离(即在计算距离前消除水平高度差),y为炮弹落点相对炮弹起始点的海拔差的相反数,velocity为炮弹初速度,gravityAccelerate为重力加速度。这样才能真正获得准确的炮弹射出仰角。

计算出仰角再将其应用到炮管上即可。

三、过渡动画

如果炮塔设定旋转速度不快,无法跟随镜头进行目标瞄准。可以为炮塔添加一个自动旋转函数,在FixedUpdate()中调用,并使用变量,将目标的旋转角度记录下来,使用插值函数来实现炮塔的平滑旋转和瞄准,获得更好的效果。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
日本“金刚”级战巡的主炮塔装弹系统
瑞典 Bandkancon 1A 155毫米自行火炮
有关火炮的两个视角——可变发射药与最大射程
深海利剑——二战德国海军舰炮
12--32磅拿破仑滑膛榴弹炮
加农炮是指炮管较长,发射仰角较小,弹道低平,可直瞄射击
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服