在開發 aPrint 系統的時候,其中一個功能是使用 CSG 把兩個 Mesh 組合成一個容器。可是在組合匯出之後卻出現 face data 重疊的情況(也有人會把它叫做 z-fighting 或是 invalid normal )
這個我研究了一段時間,發現這是跟 extrude 模型的時候的設定有關。一般來說,為了避免模型在背面出現破圖,所以在 render 的時候也會把 rendering face 設成雙面。以下為其中一個例子
BABYLON.MeshBuilder.ExtrudeShape("container-outerwall", {
shape: externalBorder,
path: [extrusionStart,extrusionEnd],
cap: BABYLON.Mesh.CAP_ALL,
sideOrientation: BABYLON.Mesh.DOUBLESIDE
}, scene);
可是這樣在 CSG 處理的時候卻會出現問題,我懷疑是與 Mesh.CAPALL 的設定有關,可是我並沒有深入研究是不是 CAP_ALL 設定了之後就不能使用 DOUBLESIDE 的設定。
然而在把sideOrientation 改成 FONTSIDE 之後問題就解決了。
BABYLON.MeshBuilder.ExtrudeShape("container-outerwall", {
shape: externalBorder,
path: [extrusionStart,extrusionEnd],
cap: BABYLON.Mesh.CAP_ALL,
sideOrientation: BABYLON.Mesh.FRONTSIDE
}, scene);
所以結論就是如果你要進行 CSG 操作的話 sideOrientation 不要設成 DOUBLESIDE 就對了。