RecastNavigation
RecastNavigation是一款非常强大的寻路系统,被广泛的应用于各大游戏引擎中。如Unreal, Unity等。
github网址:https://github.com/recastnavigation/recastnavigation
与体素的关系
在前面章节,介绍过《天涯明月刀》中,使用了体素的概念,来实现服务器端3D场景。
理解了RecastNavigation的实现后,对比下,前者太简单粗暴了!
RecastNavigation在体素概念的基础上,进一步提炼,最终使用NavMesh的概念来表达3D场景。
提炼过程如下:
3D场景 => 多层体素 集合 => 邻接凸多边形 集合
NavMesh是什么
RecastNavigation最终输出的,也是基于运作的数据是:邻接的凸多边形集合
。
即使用了邻接的凸多边形集合
描述了一个3D场景。
加之A*寻路算法,使3D场景的可达性得到保证。
NavMesh中文名称:导航网格
A*寻路算法即为导航;凸多边形即为网格。
因此 NavMesh = A* + Convex Polygon
RecastNavigation有哪些内容
主要包含2大类:
- Recast,用于生成
邻接的凸多边形集合
数据 - Detour,基于
邻接的凸多边形集合
的A*寻路算法
细分Recast生成的数据,又有3类:
- Solo Mesh,纯粹的邻接凸多边形集合
- Tile Mesh,基于tile划分的N个邻接凸多边形集合
- Temp Obstacles,支持动态障碍物的,基于tile划分的N个邻接凸多边形集合
以上3种各有各的适合场景,按业务需求选择,或结合之。
RecastNavigation能做啥
- 能表达一个3D场景
- 能接近精确的赋予游戏对象(x、y、z)属性
- 能判断3D场景表面2个点的可达性
- 能动态改变3D场景地形
RecastNavigation不足
RecastNavigation所有操作都基于地表面。
因此,对空中的对象的交互,用它是无法完成的。
通常这时会结合其他引擎,如physx。
下面是引用作者的原话:
Recast raycast checks “walkability” along the navmesh. You will need a starting point on the navmesh for that. To raycast against level geometry, you should use some other system, i.e. physics or roll your own.
RecastNavigation使用例子
本人的RecastNavigation封装库:
github地址:https://github.com/fananchong/NavMeshScene
欢迎指正错误与不足