【3D】游戏Navigation(Recast&Detour)导航寻路RecastDemo讲解

版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/80896557

发现网上有关此寻路库的中文资源十分稀少,故发布出来与诸位共享交流。

如文中有不对之处,请大家指出,本人尽尽力修正.

在2D游戏中,我们常常使用A星算法,基于方形网格进行寻路。


(图:2D游戏中的A星寻路)


但是在3D游戏中,场景巨大,2D的方形网格寻路虽然可用,但效率极低。

这时候,用NavMesh导航网格寻路是最佳的解决方案。


(图:unity3d中的寻航寻路网格)

在unity3d中的导航寻路组件Navigation,可以根据3D场景生成用于寻路的导航网格NavMesh。


本文介绍寻路功能的主角:Recast Navigation。

该库使用十分广泛,基于C++语言编写。Unity引擎官方的寻路,unreal的UDK的寻路均基于它开发的。

这个库目前也是开源的。https://github.com/recastnavigation/recastnavigation

下载到本地,我们主要看一下它的RecastDemo示例。编译后运行生成的RecastDemo.exe界面如下:


这个库主要包含两大部份。

  • 第一部分是Recast,主要功能是将场景网格模型生成用于寻路的网格模型(Navigation Mesh)。
  • 第二部分是Detour,主要功能是利用上一步所生成的Navigation Mesh进行寻路,其包含了多种寻路算法。

运行RecastDemo.exe , 看看它的右边的菜单,有哪些功能,我使用中文进行了标注。


(1)Rasterization:用于设定体素的尺寸。

cellSize:较小的值能够产生更加精确接近原始集合图形的网格,减少在生成导航网格过程中生成多边形产生较大偏离度的问题,但是会消耗更加多的处理时间和内存占用。

cellHeight:较低的值并不会对内存消耗产生有显著影响,较低的值虽然能够使网格贴合原始图形,但是如果是凹凸不平的地形,较低的值可能会造成邻接的网格之间产生断裂,导致本来应该连在一起的网格造成分离。设置较高时,可以看到网格和原始图形间距较大。


(2)Agent:用于虚拟角色的设置。

Height: 角色的身高。

Radius:角色的半径。

Max Climb:描述成生活中爬楼梯时,每个台阶的高度。

Max Slope:描述成生活中爬坡的坡度,以角度值进行设置。


在新版本的unity3d的导航bake界面,画出了一张这样的图,进行了详细的表述。

(3)其余参数如下:


  • Watershed :分水岭算法,最经典、效果最好,但处理比较慢,一般用于离线处理。
  • Monotone :最快且可以保证生成的是不重叠、没有洞的 Region,但是生成的 Region 可能会又细又长,效果不好。
  • Layer:速度、效果都介乎分水岭算法和 Monotone partioning 之间,比较依赖于初始数据。

导航网格NavMesh生成算法比较复杂,建议直接使用这个库可以解决大多数3D场景项目需求。

官方自带的这个RecastDemo功能比较全面,包含了生成导航网格,导航寻路等可视化功能演示。

希望本文对大家有所帮助。


猜你喜欢

转载自blog.csdn.net/sjt223857130/article/details/80896557