本文对初学者来说比较有难度。建议从基本行为开始慢慢尝试,我自己写的时候也尝试了很多基本的飞行方式,最终解决了多重问题,最终才得到不错的结果。飞行方式有以下几种:
要实现集群效果,Seek、Flocking这两种行为是最必要的,其它行为可以参考工程代码和其他资料。基本数据和初始化如: a. Seek方式
Seek的方式是最基本的,它返回一个力(向量),引导鸟飞向目标:
向量运算自行画图分析,我就不啰嗦了。这个力如何使用呢?只需要在Update的每一桢调用Seek,每一桢算一次Steering引导力即可。
然后让引导力生效即可:
第一步很简单吧?接下来看终点Flocking方式。 b. Flocking
Flocking的原理不像Seek那么直观,必须参考一些资料。总的来说,集群中的鸟:需要考虑三个基本问题,分散、统一方向、聚合:
上图摘自游戏AI的经典书籍《Programming Game AI By Example》。如图,简单来说,只看Separation分散和Cohesion聚合,你会发现其实它俩就像弹簧一样,聚合负责压紧弹簧,分散负责弹开弹簧。当离得太近,弹力就比压力大了,当离得太远,压力又比弹力大。只要合理调整这两个力的大小,就能实现一个大小合适、密度合适的群体。
而Alignment保证大家尽可能朝向一个方向。
Flocking函数全貌如下图,可以看出每一只鸟在决定自己行为之前,要先观察所有周围的鸟,这是通过把周围的鸟加入临时容器实现的。后面的Separation、Alignment、Cohesion要用到这个容器。
分散力,思路是远离所有周围的人:
聚合力,思路是尽量飞向群体的“质心”:
统一方向力,思路是只看别人的速度方向,不看大小。然后向该方向移动:
Seek和Flocking原理完成啦!只要同时应用Flocking和Seek两种力,就能实现基本的集群效果。
四、关键性调整
以上修改,已经达到了本文演示的目的,而且效果个人觉得还挺好看的,体现了鸟类集群飞行的美感。如果你的游戏中需要用到鸟群作为装饰,稍微优化一下算法也基本够用了。
但是深究的话,余下的问题还有很多,值得思考:
1、当引导力指向后方,我们直接去掉引导力的向后分量,会导致出现很大的转弯半径,作为演示来说挺炫酷,但是不符合实际,思考飞机转弯的例子,如果能模拟鸟类急转弯,就会更好看了。
2、动画方面,鸟类会综合使用扑翼、滑翔、爬升等动作,应当根据实际调整。我们目前只实现了调整动画速度,很不完美。
相信解决了以上两个问题,鸟群的模拟效果还能再上一层楼,也更符合实际。小问题总是需要花大力气解决,魔鬼总在细节之中~~ GitHub工程地址:
mayao11/GameAIAdvanced 参考书籍: Programming Game AI By Example, by Mat Buckland. 译名:《游戏人工智能编程案例精粹》
对游戏开发感兴趣的同学,欢迎围观我们:【皮皮关】 ,会定期更新各种教程干货,更有别具一格的线下小班教育。
我们的官网地址:http://levelpp.com/
我们的游戏开发技术交流群:610475807
我们的微信公众号:皮皮关