我有一个从SCNScene创建的MDLAsset。如何提取MDLMeshs,MDLCamera和MDLLights?

时间:2016-11-04 19:45:51

标签: scenekit metal modelio metalkit scnscene

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

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

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

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

这是我用的吗?

我在SceneKit建模器中仔细标记了东西。我不能指那些理想的东西吗?当然,我可以访问一个id /标签字典。我在这里缺少什么?

更新0

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

enter image description here

一些事情。我看到MDLMeshMDLSubmesh就是我所追求的。获得它的遍历方法是什么?同样适用于灯光和相机。

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

2 个答案:

答案 0 :(得分:2)

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

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

请注意,即使MDLAssetMDLObjectContainerComponent符合NSFastEnumeration,在Swift中对它们进行枚举也会有点痛苦,您可能需要手动扩展它们以符合{{ 1}}让你的工作更容易一些。

答案 1 :(得分:1)

获取所有相机,

[asset childObjectsOfClass:[MDLCamera class]]

同样,要获取所有MDLObject,

[asset childObjectsOfClass:[MDLObjects class]]

MDLSubmeshes不是MDLObject,因此您遍历MDLMesh上的那些。

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

您可以做的一件事是通过设置网格的vertexDescriptor属性在现有MDL对象上强加一个新的顶点描述符。有关讨论,请参阅MDLMesh.h标题。