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

Posted

技术标签:

【中文标题】SceneKit:已从 STL 导入的导出网格导致垃圾【英文标题】:SceneKit: export mesh that has been imported from STL results in garbage 【发布时间】:2020-08-19 00:12:40 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于SceneKit:已从 STL 导入的导出网格导致垃圾的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit 中的金属生成网格

DAE 文件解析错误

从 Collada (.dae) 文件(在 Maya 中创建)导入的 SceneKit 键控混合形状动画未播放

如何将复杂的 .dae 模型导入到 SceneKit?

FreeCAD 导出STL格式文件格式

FreeCAD 导出STL格式文件格式