SceneKit:从 STL 导入的导出网格导致垃圾

SceneKit: export mesh that has been imported from STL results in garbage

我正在使用 this gist 将二进制 STL 3d 网格导入 SCNNode,效果很好(我可以在 SCNView 中查看网格,它看起来不错)。

但是,如果我尝试使用 MDLAsset.export(to: url)SCNScene.write(to: url) 将(未更改的)网格导出到 STL 或 OBJ 文件,生成的网格会损坏。

如果我加载示例 ship.scn 场景然后导出到 STL,一切看起来都不错。 这让我觉得上面提到的要点如何创建 SCNNode 一定有问题,但我无法弄清楚它是什么。

实际型号: STL/OBJ 导出结果:

我自己想出来了。 SCNGeometryElement 的构造函数允许为索引数据传递 nil。虽然这对于在场景中显示网格很好,但至少导出功能和框架的其他部分可能依赖于正在填充的数据——这与人们的预期相反——不是由构造函数自动完成的。所以你需要自己做。幸运的是,还有另一个构造函数可以使这更容易:

let indices = [UInt32](0..<UInt32(trianglesCounted * 3))
let countedTriangles = SCNGeometryElement(indices: indices, primitiveType: .triangles)