NavMesh
全库目录221
本文目录9
守卫半径为0.4米,导航需要先从场景几何生成容得下身体的可行走空间。本文说明空间表示、烘焙参数、世界尺度与移动支撑的数据组织;输出交给导航目标投影和导航动作交接。
可行走空间
可行走空间表示
路点图适合路线由设计师明确控制的场景,节点少、语义清楚,但覆盖大地图的维护成本高。规则网格容易生成和动态修改,也方便使用曼哈顿距离,不过内存随地图面积增长,锯齿路径需要额外平滑。
NavMesh用凸多边形组织可行走表面。水平导航投影中的凸多边形允许内部两点直线连接,高度沿详细表面恢复;带坡度变化的地形仍需身体扫掠与运动约束验证。相同覆盖范围下,多边形表示通常比细网格需要更少搜索节点。稀疏体素八叉树更适合飞行、太空或水下等真正的三维导航,但邻接构造、内存布局和动态更新都更复杂。
表示里不仅要有“能否通过”,还应保存区域代价、坡度、角色半径、门和跳跃等网格外连接。不同体型不能盲目共享一张只按点角色生成的网格。
NavMesh 生成
常见生成流程先把场景三角形体素化,按角色允许的坡度和台阶高度标记可行走高度段,再合并连通区域。过小孤岛会被删除,区域边界被提取为轮廓,最后简化并三角化或合并成凸多边形。
角色半径通常通过侵蚀可行走区域处理,让寻路中心线天然远离墙面。若半径、台阶高度或体素尺寸设置不合理,会出现窄门消失、楼层粘连和台阶断裂。生成质量需要在几何精度、节点数量和烘焙时间之间平衡。
体素尺寸是精度与内存的杠杆:高度方向要能区分设计中的台阶,水平方向决定窄通道能否保留。Recast的rcConfig文档建议从cs=r/2或r/3、ch=cs/2开始评估,其中r是角色半径;这些值是烘焙起点。台阶高度更细时继续减小ch,并检查控制器的实际可攀爬能力。walkableSlopeAngle使用角度,cs与ch使用世界单位,区域阈值按对应高度段计数解释。每次改参数后用同一测试关卡核对窄门、台阶、悬空边缘和烘焙耗时。
动态障碍可用瓦片局部重建、临时代价体或运行时避障。频繁移动的小角色不适合每帧切 NavMesh;真正改变拓扑的大门、桥和破坏区域才需要更新全局表示。
世界空间与缩放
守卫的0.4米半径描述世界中的身体。烘焙先把资产单位换算为米,再用完整祖先链与对象变换将三角形送到世界空间;半径、身高、台阶高度和体素尺寸都在这份几何上使用世界米。同一条局部宽1米的门道,父节点均匀缩放为0.5后只有0.5米宽,容不下直径0.8米的守卫。门道与守卫之间的比较必须发生在同一空间。
设完整变换的线性部分为A,局部位移d的世界长度为length(A*d)。均匀缩放s时,世界半径r可以换成局部半径r/abs(s);非均匀缩放或剪切时,世界圆在局部对应椭圆,单一局部半径不能表达各方向的净空。本文选择将三角形完整变换后重新烘焙。坡度以变换后三角形的世界法线与世界Up比较,负行列式变换同步修正三角形绕序;退化三角形按面积容差过滤,无法稳定构造表面的输入返回几何错误。带非均匀缩放或剪切的导航实例也通过这条世界几何路径生成数据。
后续漏斗、圆弧和速度约束共享由世界Up确定的水平正交基。门户端点和位置先投影到该基,二维距离保持水平世界米;高度另由详细网格和控制器恢复。接入以Y为上轴的Recast时,导入适配器把这两个水平轴映射为X、Z,把世界Up映射为Y;该正交换基保持长度。速度使用米/秒,加速度使用米/秒²,几何容差使用对应世界尺度。门户已经位于世界空间,跟随器直接消费这些坐标。这样烘焙侵蚀的身体半径、圆弧半径和控制器扫掠体才会描述同一个守卫。局部存储的路线在交接时连同生成它的变换版本一起转换,完整世界变换只应用一次。
导航烘焙的数据交接
三角形的坡度判定使用世界Up与面法线点积,体素化把同一个水平单元里不同高度的占据区间合并为高度段;低天花板过滤比较自由空间高度,台阶过滤比较相邻可行走高度差。参数由米转换到网格单位:半径取ceil(radius/cellSize),净空高度取ceil(height/cellHeight),可跨台阶取floor(maxClimb/cellHeight),舍入方向分别保护身体体积与最大攀爬能力。比如半径0.4米、水平体素0.15米,需要3格侵蚀;2格只保留0.3米间隙,会接受实际过窄的通道。
侵蚀按可行走高度段的水平邻接传播到障碍的距离,删除小于角色半径的中心位置;它不等于把每个三维三角形沿法线缩小。过滤后保留跨越允许高度差的邻接,再连通分区和提取轮廓,得到的多边形记录邻接、区域代价和导航数据版本。坡道上的高度由详细网格恢复,二维漏斗只决定水平转向;上下两层地板不能仅因水平投影重叠就连接。跳跃、电梯等网格外连接携带动作类型和端点,执行器要先完成相应动作再跨越,不直接当成可瞬移的普通门户。
移动平台另记录导航几何的所属支撑。烘焙时先把资产尺度与祖先缩放落实到实际米制几何,再把同一刚体上的多边形、详细网格和门户保存到该支撑的正交局部坐标;运行时按支撑刚体姿态生成世界坐标。形状及尺度版本描述烘焙输入,运动版本描述支撑在时间轴上的姿态,两者分开保存。刚体平移和绕世界Up的旋转保持直立角色的净空与坡度。其他旋转虽然保持几何长度,却会改变世界坡度及直立胶囊相对表面的净空,须据当前姿态重新生成有效区域;候选与跟随等待匹配的区域版本,已有实例从实际接触状态制动或重新接入。缩放、形变或拓扑修改则使几何版本失效并触发重建。
平台内部门户随同一刚体运动;平台与静态地面或另一平台之间的连接带双方身份、接触条件和有效时间,不登记成永久共有边。采用与每步交接检查该连接在实际时刻是否仍成立,身体跨越使用两侧世界曲线。世界中的墙体和新障碍仍由各自边界运动及扫掠检查,不能因平台内的局部路线未变就跳过它们。
验证方法
固定窄门、台阶、斜坡和断桥关卡,改变体素大小或角色尺寸,比较连通区域、身体扫掠和烘焙耗时。缩放父节点后检查源几何版本失效;多层地板投影重叠时确认邻接仍分层。
实现与证据
烘焙过程与参数按Recast资料核读,世界变换及版本规则是本文接入契约。尚未烘焙测试关卡,参数效果与动态更新需要目标引擎验收。
相关主题
参考资料
- Recast rcConfig:cs、ch使用世界单位,walkableClimb、walkableRadius使用体素单位,水平面为XZ;2026-10-24复核。世界单位取米、缩放几何重建与源版本失效规则是本页的接入契约。
- Recast Navigation:体素化、侵蚀、区域与多边形生成;2026-10-22核读。