核心構建過程
http://www.critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm
本文涵蓋 NMGen 構建導航網格的核心處理過程。網格的生成處理有許多變種,但他們都包含這些步驟。
IncrementalBuilder 擴展實現了這些處理。
處理過程如下:
- 體素化:用源幾何模型生成 "solid heightfield" 代表阻擋空間。
- 生成域:探測 "solid heightfield" 的上表面,把他划分成連續的空間段。
- 生成輪廓:探測這些區間的輪廓,把他們划分成 "simple polygons"(simple polygons which do not self-intersect)。
- 生成多邊形網格:將輪廓細分成凸多邊形。
- 生成 Height Detail:三角化多邊形網格並添加高度細節。
體素化:
核心類:Heightfield
體素化幾何體是指用抽象的 heightfield 代表阻擋空間。然后這些阻擋會被剪裁掉。
源幾何體中的三角形通過 "conservative voxelization" 算法體素化 下載。 "conservative voxelization" 算法能夠將所有的三角面都包裹在它生成的體素模型中。
體素化后,"solid heightfield" 的空間中會完全包含源幾何所有的面。
生成域:
核心類:CompactHeightfield
這一步為了確定哪些區域是可以行走的,並將這些區域連起來生成 "simple polygons"。
先將可以行走的空間由 "solid heightfield" 轉成 "open heightfield"。"open heightfield" 代表空間中可能成為地面的部分。
如下所示,綠色區域代表開放空間中的地面。這代表 "solid heightfield" 可行走區域中上面的面(box top)。像牆、桌子底下、陽台扶手等應該在 "solid heightfield" 生成時剪切掉。一些不能走的區域如桌子上、樓梯扶手、牆沿這時還是可走的。
下一步,刪除不可行走的區域。最后開放空間只包含通過以下測試的區域:
- 離阻擋空間不能太近。(如牆、家具等)
- 有足夠的空間(移動代理可以不與其他物體碰撞地通過)
相鄰信息用於把開放空間連起來。算法需要考慮垂直的最大距離閾值,這允許將樓梯、路沿、桌面等考慮進來。例如,樓梯會連在一起,但桌面和地面不會相連。
區域使用相鄰信息和分水嶺算法(watershed algorithm)。區域的大小可優化,太小的區域會被剪裁。
下例展示的區域中,樓梯之間雖然有空隙仍被連在一起。桌面、樓梯扶手和其他不可走的區域已被剪裁。(黑色代表剪裁掉的空間)
最后,可行走的面被連在一起。
生成輪廓:
核心類:ContourSet
區域的輪廓是由可行走的多面生生成的。第一步將體素空間轉到頂點空間。
首先,用這些區域生成有詳細描述的多邊形。
接下來,有多個算法將被用於完成這個處理過程:
- 簡化多邊形的邊界(區域之間)
- 簡化邊界線
- 優化邊的長度(邊太長不能生成優質三角形)
下展示了計算后的邊界。
生成凸多邊形:
核心類:PolyMesh
許多算法都只能用於凸多邊形。所以這一步將輪廓划分成凸多邊形。
下圖是加工后的,混合凹多邊形的輪廓圖。
生成詳細高度圖:
核心類:PolyMeshDetail
最后,凸多邊形用 "Delaunay triangulation" 算法三角化,高度細節也將被添加進來。添加頂點到多邊形的邊上,並確保與原多邊形的面貼合。