上一課(6-8a)提到 MeshResource 客製化幾何模型的兩種方法,除了擠出成型(Extrusion)之外,另一種就是「網格描述」(MeshDescriptor),網格描述是比較低階的方法,透過精確描述3D物體的幾何參數來產出網格,什麼意思呢?

一個3D模型網格其實是由點、線、面所構成,這裡的點線面不是一般的 point, line, plane,而是幾何的頂點(稱為”vertex”)、邊(”edge”)與多邊形面(”face”或”polygon”),網格描述就是要列舉所有頂點(座標)以及多邊形面的組成。

我們都知道最基本的幾何常識:不重合的兩點構成一直線;不共線的三點決定一平面。那麼,最少需要幾個點才能構成一個3D物體呢?答案是4個點。本節就用4個點來做個「正四面體」,示範網格描述的用法。

6-9a 正四面體

正四面體由4個頂點、6個邊、4個面(相同大小的正三角形)所構成,我們需要描述的,是其中4個頂點以及4個面的組成,如下圖:

截圖 2025-04-03 中午12.04.54.png

第一步是描述正四面體的4個頂點座標,怎麼算呢?空間座標的計算比平面座標困難多了,筆者是以 AI 輔助,問ChatGPT:「一個半徑為1的單位球體,如何算出內接正四面體的每個頂點座標」,然後再參考網路文章加以驗算。

第二步是描述4個三角形面,MeshDescriptor 要求每個三角形必須以「逆時針方向」(從外面看)列出3個頂點的陣列索引,例如上圖的三角形ACB (0, 2, 1),不能寫成三角形ABC (0, 1, 2)。

為什麼不能用任意次序呢?這與光照有關,當模型在渲染(Rendering)過程中,會計算網格中每個三角形的法線(垂直於三角形面的向量),法線須指向光線的來源。

但是每個三角形的法線其實有兩個方向,如果用三角形ABC,算出來的法線會與三角形ACB的法線方向相反(指向球心),材質紋理變成在內面,從外面看,這面就會變成透明,整個模型就不完整了。

有了上述兩筆資料,對應網格描述的位置(.positions)以及多邊形(.primitives,字意是初始、原形),就可用 MeshResource.generate(from: [網格描述]) 來產出網格,進一步做出正四面體模型: