我有从 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 调试器中的场景图。叹息...
几件事。我看到 MDLMesh
和 MDLSubmesh
这就是我所追求的。得到它的遍历方法是什么?灯光和相机也是如此。
我还需要知道顶点描述符的布局,以便与我的着色器同步。我可以在解析的 SCNScene
上强制使用特定的顶点布局吗?
MDLObject
有一个 name
(因为它符合 MDLNamed
协议),还有一个 path
,它是它祖先的名字,但不幸的是,这些不包含它们的 SceneKit 对应物的名字。
如果您知道需要遍历资产的整个层次结构,最好自己显式递归(首先遍历资产的顶级对象,然后递归枚举它们的子对象) ,因为重复使用 childObjects(of:)
会在内部遍历整个层次结构以收集指定类型的所有对象。
请注意,即使 MDLAsset
和 MDLObjectContainerComponent
符合 NSFastEnumeration
,在 Swift 中枚举它们可能会有点痛苦,您可能需要手动扩展它们符合 Sequence
以使您的工作更轻松。
获取所有摄像头,
[asset childObjectsOfClass:[MDLCamera class]]
同样,要获取所有 MDLObjects,
[asset childObjectsOfClass:[MDLObjects class]]
等等
MDLSubmeshes 不是 MDLObjects,因此您在 MDLMesh 上遍历它们。
目前没有办法在从 SCN object 创建的 MDL object 上强加顶点描述符,但这很有用。
您可以做的一件事是通过设置网格的顶点描述符 属性 在现有 MDL object 上强加一个新的顶点描述符。请参阅 MDLMesh.h header 进行一些讨论。
我正在努力尝试遍历通过加载 SCNScene
文件 (.scn) 创建的 MDLAsset
实例。
我想识别并提取 MDLMesh
以及相机和灯光。我看不到直接的方法。
例如我在 MDLAsset 上看到这个实例方法:
func childObjects(of objectClass: Swift.AnyClass) -> [MDLObject]
这是我用的吗?
我在 SceneKit 建模器中仔细标记了东西。我可以不提那些理想的吗?当然,我可以访问 ids/labels 的字典。我在这里错过了什么?
更新 0
由于完全缺乏 Apple 文档,我不得不求助于 Xcode 调试器中的场景图。叹息...
几件事。我看到 MDLMesh
和 MDLSubmesh
这就是我所追求的。得到它的遍历方法是什么?灯光和相机也是如此。
我还需要知道顶点描述符的布局,以便与我的着色器同步。我可以在解析的 SCNScene
上强制使用特定的顶点布局吗?
MDLObject
有一个 name
(因为它符合 MDLNamed
协议),还有一个 path
,它是它祖先的名字,但不幸的是,这些不包含它们的 SceneKit 对应物的名字。
如果您知道需要遍历资产的整个层次结构,最好自己显式递归(首先遍历资产的顶级对象,然后递归枚举它们的子对象) ,因为重复使用 childObjects(of:)
会在内部遍历整个层次结构以收集指定类型的所有对象。
请注意,即使 MDLAsset
和 MDLObjectContainerComponent
符合 NSFastEnumeration
,在 Swift 中枚举它们可能会有点痛苦,您可能需要手动扩展它们符合 Sequence
以使您的工作更轻松。
获取所有摄像头,
[asset childObjectsOfClass:[MDLCamera class]]
同样,要获取所有 MDLObjects,
[asset childObjectsOfClass:[MDLObjects class]]
等等
MDLSubmeshes 不是 MDLObjects,因此您在 MDLMesh 上遍历它们。
目前没有办法在从 SCN object 创建的 MDL object 上强加顶点描述符,但这很有用。
您可以做的一件事是通过设置网格的顶点描述符 属性 在现有 MDL object 上强加一个新的顶点描述符。请参阅 MDLMesh.h header 进行一些讨论。