recastdemo原始碼詳解 002

2021-09-25 13:39:32 字數 2217 閱讀 7214

上篇部落格講到了體素化,接下來我們要把體素化生成的資料儲存起來,span可以理解為擁有相同x,z座標的體素的集合。

是用鍊錶結構儲存然後這個資訊會儲存在rcheightfield結構裡面

這裡進行的操作是對可行走平面進行過濾

rcfilterlowhangingwalkableobstacleswalkableclimb(可攀爬高度)如果兩個span的上表面差值小於這walkableclimb時,如果下面乙個span是可行走平面,那麼上面這個span也要被標記成可行走平面

rcfilterledgespans凸起(ledge)檢測,如果乙個span到它相鄰的span高度超過了walkableclimb,認為這個span是乙個凸起,標記為不可行走

rcfilterwalkablelowheightspans高度檢測,如果乙個span的上表面(smax)距離他上面的span的下表面(smin)距離小於walkableheight,那麼這個span被標記為為不可行走,例如桌子的下面,高度比較低就不可以行走

關於高度場的詳細講解

把高度場轉化為緊縮高度場

然後把每乙個span4個方向的可達的span的下標有壓縮在乙個int裡面

因為設定的最打壓縮座標為(1<<6)-1,如果每個體素點有超過max_layers個span,那麼久認為這個資料非法,不寫到資料裡面,打log,

rcbuildcompactheightfleld 根據walkableradius來計算邊緣不可行區域

rcmarkconvexpolyarea 不清楚

rcbuildheightfieldlayers 這個函式的功能是把spans,分層,分塊,具體實現稍微有點複雜,

首先按照x軸,相同的相連的span看做一段,用srcreg標記,

同時把這一段前面一行(x軸的前一行)相連的段儲存下來,如果這一段與兩個不同段相連(在下面畫了乙個比較抽象的圖)

那麼就不再標記這一段的相連段(原因後面會解釋)

在這裡用到了之前提到的段的相連段的屬性,注意有兩個屬性是ns,和precount,ns代表某一段包含的span數,preconunt代表乙個段被多少個span相連,如果這兩個相等就把他們合成乙個段(這裡段用的是博主自己的理解,可能不是很好,可以理解為集合)。這裡是為了處理層這個問題,比如說有乙個樓梯連線了兩層的span,那麼樓梯邊緣這部分span會是上下兩層樓層地面的相連段,這種情況下,很明顯不一樣作為乙個段。

如下圖所示,藍色,紅色青色,3個段,青色段是藍色段和紅色段的相連段,但是藍色段和紅色段不在同一層,所以不能算作一段

這裡更新了srcreg的資訊

定義了seg陣列用於儲存span的一些資訊,有相鄰span的段資訊,相同區域,不同層的段資訊。

然後對段進行合併,然後就得到一些集合,每個然後在對不同集合在沒有覆蓋的情況下的在一定高度內的集合進行合併,然後對這些集合的id進行重新分配,就得到了rcheightfieldlayerset,

ArrayList原始碼詳解

成員變數的宣告 成員變數的宣告 private static final object empty elementdata transient object elementdata 儲存元素的陣列 private static final int default capacity 10 構造方法初始...

HashMap原始碼詳解

成員變數static final int default initial capacity 1 4 aka 16 static final int maximum capacity 1 30 aka 2 30 static final float default load factor 0.75f ...

Hashtable原始碼詳解

成員變數private transient entry table 儲存鍊錶的陣列 private transient int count private int threshold private float loadfactor private transient int modcount 0 ...