我有从 SCNScene 创建的 MDLAsset。如何提取 MDLMesh、MDLCamera(s) 和 MDLLights?

I have MDLAsset created from an SCNScene. How do I extract MDLMeshs, MDLCamera(s), and MDLLights?

我正在努力尝试遍历通过加载 SCNScene 文件 (.scn) 创建的 MDLAsset 实例。

我想识别并提取 MDLMesh 以及相机和灯光。我看不到直接的方法。

例如我在 MDLAsset 上看到这个实例方法:

func childObjects(of objectClass: Swift.AnyClass) -> [MDLObject]

这是我用的吗?

我在 SceneKit 建模器中仔细标记了东西。我可以不提那些理想的吗?当然,我可以访问 ids/labels 的字典。我在这里错过了什么?

更新 0

由于完全缺乏 Apple 文档,我不得不求助于 Xcode 调试器中的场景图。叹息...

几件事。我看到 MDLMeshMDLSubmesh 这就是我所追求的。得到它的遍历方法是什么?灯光和相机也是如此。

我还需要知道顶点描述符的布局,以便与我的着色器同步。我可以在解析的 SCNScene 上强制使用特定的顶点布局吗?

MDLObject 有一个 name(因为它符合 MDLNamed 协议),还有一个 path,它是它祖先的名字,但不幸的是,这些不包含它们的 SceneKit 对应物的名字。

如果您知道需要遍历资产的整个层次结构,最好自己显式递归(首先遍历资产的顶级对象,然后递归枚举它们的子对象) ,因为重复使用 childObjects(of:) 会在内部遍历整个层次结构以收集指定类型的所有对象。

请注意,即使 MDLAssetMDLObjectContainerComponent 符合 NSFastEnumeration,在 Swift 中枚举它们可能会有点痛苦,您可能需要手动扩展它们符合 Sequence 以使您的工作更轻松。

获取所有摄像头,

[asset childObjectsOfClass:[MDLCamera class]]

同样,要获取所有 MDLObjects,

[asset childObjectsOfClass:[MDLObjects class]]

等等

MDLSubmeshes 不是 MDLObjects,因此您在 MDLMesh 上遍历它们。

目前没有办法在从 SCN object 创建的 MDL object 上强加顶点描述符,但这很有用。

您可以做的一件事是通过设置网格的顶点描述符 属性 在现有 MDL object 上强加一个新的顶点描述符。请参阅 MDLMesh.h header 进行一些讨论。