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

我想识别并提取MDLMesh以及相机和灯光。我认为没有直接的方法可以做到这一点。

例如,我在MDLAsset上看到此实例方法:

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


这是我用的吗?

我已经在SceneKit建模器中仔细标记了东西。我能不能说那些是理想的。当然,有一个我可以访问的ID /标签字典。我在这里想念什么?

更新0

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

scenekit - 我有从SCNScene创建的MDLAsset。如何提取MDLMesh,MDLCamera和MDLLights?-LMLPHP

一些东西。我看到的是MDLMeshMDLSubmesh。什么是遍历方法来获得它?同样适用于灯光和相机。

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

最佳答案

MDLObject有一个name(因为它符合MDLNamed协议),还有一个path,是其祖先名称的斜杠分隔,但不幸的是,这些不包含他们对应的SceneKit的名称。

如果您知道需要遍历资产的整个层次结构,则最好自己显式地进行遍历(首先遍历资产的顶级对象,然后递归枚举其子级),因为使用了反复将在内部遍历整个层次结构,以收集指定类型的所有对象。

请注意,即使childObjects(of:)MDLAsset符合MDLObjectContainerComponent,在Swift中枚举它们也可能会有些痛苦,并且您可能希望手动扩展它们以符合NSFastEnumeration,以使您的工作更轻松一些。

09-19 04:21