3

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

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

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

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

这是我用的吗?

我已经在 SceneKit 建模器中仔细标记了事物。我可以不参考那些理想的吗?当然,有一本我可以访问的 ids/labels 字典。我在这里想念什么?

更新 0

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

在此处输入图像描述

一些东西。我看到了MDLMeshMDLSubmesh这就是我所追求的。获取它的遍历方法是什么?灯光和相机也是如此。

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

4

2 回答 2

2

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

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

请注意,即使MDLAssetMDLObjectContainerComponent符合NSFastEnumeration,在 Swift 中枚举它们也可能有点痛苦,您可能希望手动扩展它们以符合 以Sequence使您的工作更容易一些。

于 2016-11-05T01:10:31.097 回答
1

要获得所有相机,

[asset childObjectsOfClass:[MDLCamera class]]

同样,要获取所有 MDLObjects,

[asset childObjectsOfClass:[MDLObjects class]]

等等。

MDLSubmeshes 不是 MDLObjects,所以你遍历 MDLMesh 上的那些。

目前还没有一种方法可以将顶点描述符强加于从 SCN 对象创建的 MDL 对象上,但这会很有用。

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

于 2016-12-15T00:20:45.927 回答