简要回答:
不是通过投影到某个平面得到的,而是直接以原三角面的实际空间位置作为导航多边形。
下面详细解释:
1. 非共面三角面生成导航多边形的方式
- 当多个三角面法线差异较大(比如地面、斜坡、台阶),它们不会被合并为一个多边形。
- 每个三角面会单独生成一个导航多边形,这个多边形的顶点就是三角面的三个顶点,直接位于原始三维空间中,不做投影。
2. 为什么不投影到某个平面?
- 导航网格的本质是让AI在三维空间的可行走表面上移动。
- 如果把三角面投影到某个平面(比如水平面),会丢失真实的空间信息,AI的移动会出现“穿模”或“悬空”。
- 导航多边形必须准确地贴合原始地形表面,这样AI才能正确地“踩”在地形上。
3. 导航多边形的空间属性
- 每个导航多边形(无论是三角形还是合并后的凸多边形)都保留在三维空间中的实际位置和朝向。
- AI在寻路时,路径点会被投影到这些多边形的表面上,保证“脚下有地”。
4. 例子说明
- 假设有一个台阶模型,由地面三角面、斜坡三角面、台阶面三角面组成。
- 这三个三角面法线差异大,不会合并。
- 导航网格会在每个三角面上各自生成一个三角形导航多边形,它们分别位于地面、斜坡、台阶的实际空间位置。
- AI在跨越这些面时,会根据多边形之间的连接关系(如边相邻、高差允许)进行寻路。
5. 总结
- 独立的导航多边形不是通过投影得到的平面,而是直接采用原三角面的空间位置。
- 这样可以保证AI在复杂地形上行走时,始终贴合真实地形表面。
我们继续深入讲解导航多边形之间的连接关系,以及AI如何在这些不共面的多边形之间平滑移动。
1. 导航多边形之间的连接关系
1.1 邻接关系的建立
- 边邻接:如果两个导航多边形(比如两个三角面)有一条完全重合的边(或在容差范围内),它们就被认为是“邻接”的。
- 连接信息:在导航网格的数据结构中,每个多边形会记录与自己相邻的多边形的索引或引用。
- 高差与步高判定:即使边重合,如果两个多边形之间的高度差超过AI的最大步高(step height),也不会建立连接。
1.2 多层/立体结构的连接
- 多层连接:比如楼梯、台阶、桥梁等,导航网格会在不同高度的多边形之间建立“跳跃连接”或“特殊连接”。
- Off-mesh Link:在Unity、Unreal等引擎中,常用“off-mesh link”来表示如跳跃、攀爬、传送等特殊移动方式的连接。
2. AI在不共面多边形之间的移动
2.1 路径点的生成
- 路径点序列:寻路算法(如A*)会在多边形之间找到一条多边形序列(poly path)。
- 每个路径点:通常是多边形的中心点、边中点,或根据实际需要插值生成。
2.2 路径平滑(Path Smoothing)
- 直线化:初步路径往往是“折线”,AI会尝试在不碰撞障碍的前提下,尽量走直线(如Funnel算法/Channel算法)。
- 投影到表面:AI的实际移动点会被投影到当前多边形的表面上,保证“脚下有地”。
- 高度插值:在两个不共面多边形之间移动时,AI的高度会根据多边形表面插值平滑过渡,避免突然跳跃。
2.3 过渡处理
- 步高处理:如果两个多边形之间有高度差,但在AI可跨越的步高范围内,AI会“上台阶”或“下台阶”。
- 坡面处理:在斜坡上,AI的移动轨迹会自动贴合斜坡表面。
3. 具体例子
假设AI要从地面(平面A)走到台阶(平面B):
- 导航网格在地面和台阶分别有独立的多边形。
- 这两个多边形有一条边重合,且高度差在AI可跨越范围内,于是建立连接。
- AI寻路时,路径会经过这两个多边形。
- AI的移动点会先在地面多边形上,接近边界时,平滑过渡到台阶多边形上,Y坐标(高度)会插值变化,表现为“上台阶”动作。
4. 相关算法
- Funnel Algorithm(漏斗算法):用于在多边形通道中生成最短、最平滑的路径。
- NavMesh Projection:将AI的目标点、移动点实时投影到当前多边形表面,保证贴地移动。
5. 总结
- 导航多边形之间通过边邻接和高差判定建立连接。
- AI在这些多边形之间移动时,路径点会被平滑地投影到各自的表面,实现自然的上下坡、上台阶等动作。
- 现代引擎和导航库都内置了这些处理机制,开发者只需设置好参数即可。