Recast Navigation 學習筆記(二)


核心構建過程

http://www.critterai.org/projects/cainav/doc/html/e72bd1ee-04b0-4bbb-a21d-d8d7ecaa11af.htm

本文涵蓋 NMGen 構建導航網格的核心處理過程。網格的生成處理有許多變種,但他們都包含這些步驟。

IncrementalBuilder 擴展實現了這些處理。

處理過程如下:

  1. 體素化:用源幾何模型生成 "solid heightfield" 代表阻擋空間。
  2. 生成域:探測 "solid heightfield" 的上表面,把他划分成連續的空間段。
  3. 生成輪廓:探測這些區間的輪廓,把他們划分成 "simple polygons"(simple polygons which do not self-intersect)。
  4. 生成多邊形網格:將輪廓細分成凸多邊形。
  5. 生成 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" 算法三角化,高度細節也將被添加進來。添加頂點到多邊形的邊上,並確保與原多邊形的面貼合。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM