上一篇传送门

前言

之前实现了一个按榴弹炮速度来计算发射仰角的博客,其效果不是很理想,虽然可以在给定炮弹速度的情况下可以将炮弹打到最远的地方,但是它的发射仰角被限制在了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

这时候高度为200

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

最后

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

Unity真实榴弹炮模拟(真正的大型榴弹炮实现)相关推荐

  1. 【Unity新闻】如何使用Unity进行机器人模拟? | AR/VR全球需求率激增1400%

    洪流学堂,让你快人几步. 我们一起看看上周Unity有什么大事情发生吧! 如何使用Unity进行机器人模拟? 机器人开发工作流程依赖于模拟进行测试和培训,Unity展示了机器人专家如何使用Unity来 ...

  2. Q101:真实地模拟一个玻璃酒杯(Wine Glass)(回旋曲面)

    0,引入 其实,这一章节的标题原本想用"Q91:真实地模拟透明材质(Realistic Transparency)(5)--Wine Glass",以便和之前透明材质相关章节联系起 ...

  3. Q91:真实地模拟透明材质(Realistic Transparency)(2)——Triangle Meshes

    这一章节是在"Q91:真实地模拟透明材质(Realistic Transparency)"的基础上测试一下Triangle Mesh图形. 之前章节的链接:http://blog. ...

  4. Q91:真实地模拟透明材质(Realistic Transparency)

    在"Q90"中,我们认为折射系数kt是一个常数,对应反射系数kr=1-kt.但是,实际情况则是:kt会因入射角的不同而变化. 这一章节,我们将真实地模拟透明材质.主要考虑两个问题: ...

  5. android游戏备份农场,真实农场模拟

    打工是不可能打工,这辈子都不可能的,只能靠经营农场来维持一下生活!真实农场模拟带给玩家最真实的经营农场的体验,玩家们在农场中养殖各种动物,植物,照顾它们长大,换取钱财,来支持你农场日常的花销.享受农场 ...

  6. Unity三体运行模拟体验

    Unity三体运行模拟体验 这两天看完三体电视剧,很想体验一把三体人的世界-于是,说干就干. 先来看看效果吧 先来个上帝视角的 Unity三体模拟上帝视角 然后再来个三体人视角的(行星视角) Unit ...

  7. Unity实战之模拟飞碟

    Unity实战之模拟飞碟 unity实现简易打飞碟游戏. 项目地址 Unity飞碟实现效果 游戏规则 一共10轮,每轮10s 轮次越高,难度越大. 每轮的一定时间都会生成一定数量的飞碟,一共有四种颜色 ...

  8. 量子计算+真实材料模拟!美国埃姆斯国家实验室科学家获得新突破

    ​ 噪声量子比特ADAPT仿真(图片来源:网络) 量子计算机的潜在功能远远超出当今的经典计算机,来自美国能源部埃姆斯国家实验室的科学家们展示了一种在材料研究中利用量子计算的新方法,通过模拟材料的自适应 ...

  9. 基于unity的飞行模拟设计

    使用unity开发游戏真是非常方便.研究飞行模拟也有一段时日,尝试过物理和数学模拟.从效果上来看,物理模拟较为真实一点.但是操作不好.数学模拟的话,虽然牺牲了飞行效果,操控是非常方便的. 所谓的数学模 ...

最新文章

  1. sql server 2008 修改sa密码
  2. 阿里亲制明信片,字节、百度直接发锅……这些公司的新年礼盒越来越会玩~
  3. 通过细胞自动机,AI在「我的世界」学会了盖房子
  4. 算法:三角形最小路径和
  5. Bootstrap-Other:UI 编辑器
  6. 富文本编辑器中空格转化为a_如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?...
  7. 全排列函数、组合函数
  8. 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
  9. 嵌入式系统——软件设计
  10. 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析...
  11. 20款优秀的可以替代桌面软件的Web应用(转载自JavaEye)
  12. python函数案例名片管理器_python实现名片管理器的示例代码
  13. Linux系统工具sar查看主机性能指标(内存、CPU、IO)
  14. js编程中常用术语-中英对照
  15. 中国十大域名注册虚拟主机提供商排行榜
  16. 对于多目标跟踪论模型CTracker的解析
  17. IPV4服务器如何支持ipv6访问
  18. linux与linux驱动
  19. vue-js实现日期加减,年月日,及单位换算。
  20. 专利申请成功后已超过4年,如何延长专利保护期?

热门文章

  1. 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列
  2. 沁恒触摸蓝牙模块方案测试体验(CH582)
  3. python输出无空格,python 2.7.5+打印列表后面没有空格的逗号
  4. 个人云盘、企业云盘傻傻分不清楚?3分钟带你清晰两者差异!
  5. 猎豹移动卖资产救业绩:通过裁员降成本,海外失利转移至国内市场
  6. 开启电脑替我记忆之路
  7. CSS 中的 text-decoration 属性
  8. 国信证券学习系列(2)
  9. Springboot+Vue整合笔记【超详细】
  10. C/C++定义全局变量/常量几种方法的区别