Babylon.js ExtrudeShape 匯出成 STL 之後出現不正常 face data 的解決方案
Toby
Toby

在開發 aPrint 系統的時候,其中一個功能是使用 CSG 把兩個 Mesh 組合成一個容器。可是在組合匯出之後卻出現 face data 重疊的情況(也有人會把它叫做 z-fighting 或是 invalid normal )

在 Windows 的 3D viewer 中可以看到全部面都有一些問題

這個我研究了一段時間,發現這是跟 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 就對了。