體素化(Voxelization)是將物體的幾何形式表示轉換成最接近該物體的體素表示形式,產生體數據集,其不僅包含模型的表面信息,而且能描述模型的內部屬性。表示模型的空間體素跟表示圖像的二維像素比較相似,只不過從二維的點擴展到三維的立方體單元,而且基于體素的三維模型有諸多應用。
由于使用的需要,需對模型進行體素化操作,這里采用了一種簡單但卻有效的操作方法。首先設定模型體素化的分辨率,假設為 N * N * N,之后的操作主要包括兩部分:
1. 對模型表面的體素化
這一步的操作比較簡單,首先計算出模型的AABB包圍盒,然后根據空間分辨率對包圍盒進行劃分,得到每個大小為(X/N) * (Y/N) * (Z/N)空間像素列表。然后對構成3D模型的多邊形或三角形列表進行遍歷,得到這些基本體元所對就應的包圍盒,然后由AABB求交運算得到這些基本體元所能影響到的體素單元,將這些體素單元做為待判斷的基本對象。為了做進一步的精確判定,使用三角形與AABB的求交算法確定這些基本體元所能影響到最終體素,并將這些體素標記為非空,這樣就完成了對3D模型表面的體素化操作。
2. 對模型內部的體素化
將模型表面體素化的操作進行完之后即可得到對模型體素表示的一個“外殼”,接下來要做的操作就是進行模型的內部體素化操作。這里采用一種簡單的方法。首先將對應的3D模型建立空間八叉樹,這棵八叉樹主要用于進行基本體元面片的求交操作。然后對模型AABB中的所有空體素,從其中心位置以軸對齊方向來發射兩條射線,這兩條射線的方向相反,但基本方向都是軸對齊的。對于這兩條的射線利用空間模型的八叉樹來得到其與3D模型的相交位置,并得到相交點的法向量及到相交點的距離,然后根據這兩點法向量之間的關系來判斷得到當前體素是在3D模型的內部或是在3D模型的外部。將這樣的操作施加于每一個空的體素之后就可以完成對3D模型內部的體素化操作。
但是將這樣的操作施加于每一個空的體素速度比較慢,故而此處可以采用掃描的方法來進行加速處理。如果判斷得到某個體素的位置為模型內部后,就可以根據射線的方向及這兩條射線與模型的交點處的距離來對當前體素相鄰的體素進行掃描,這樣不需要再做判斷就可以標記出相鄰體素的狀態,這樣就加速了整個模型內部的體素化操作。
但是上述這種方法具有局限性,對于非完全閉合的3D模型,這種方法不能很好地進行內部體素化操作,不過自己工程的需要中,這種方法就已經適用了,而且簡單易行。
新聞熱點
疑難解答