Recast细节网格:找回丢失的高度
从一个尴尬的场景说起
导航网格生成完了。你兴冲冲地把NPC放进去测试。
NPC从村口出发,沿着小路走向山顶的瞭望塔。路径规划完美——他选了最短的路线,绕过了所有障碍物,每一步都走在可行走区域内。
但你盯着屏幕看了三秒钟,觉得哪里不对。
NPC在爬坡的时候,脚下的地面是一个大三角形。这个三角形从山脚一直延伸到山顶,跨越了30米的高度差。
三角形只有三个顶点。三个顶点的高度分别是0米、15米、30米。
NPC走到三角形中间的时候,导航网格告诉他:你现在的高度应该是15米。
但实际的地形在这个位置有一个平台,高度只有8米。
NPC悬浮在空中。脚下7米处才是真正的地面。
他像踩着隐形的玻璃地板一样,在空中飘过了整个山坡。
一、问题出在哪?
问题出在前面几步的"简化"上。
回忆一下Recast的流程:
体素化的时候,地形被切成了小方块。每个方块的高度精度是cellHeight,比如0.2米。这个精度是够的。
但后面的每一步都在扔信息。
轮廓提取的时候,大量的中间顶点被Douglas-Peucker算法删掉了。一条有50个顶点的锯齿边界,可能被简化成只有5个顶点的折线。那45个被删掉的顶点,每个都带着自己的高度信息。删掉之后,高度信息就没了。
多边形生成的时候,三角形被合并成更大的凸多边形。合并的过程中,共享边上的顶点被去掉了。又丢了一批高度信
