如何在SceneKit中获取纹理的文件名

时间:2012-09-04 21:51:59

标签: macos collada scenekit

我想在MacOS上使用SceneKit来加载Collada文件并获取场景节点属性,以便将它们与我自己的场景图一起使用。

我可以轻松访问顶点,法线,变换矩阵,材质属性等 - 除纹理文件名外的所有内容。

我希望纹理的文件名存储在SCNMaterialProperty Class的实例中。来自文档:

  

SCNMaterialProperty类封装了一个纹理和一组   指定如何在对象上应用纹理的属性。

但是我只能得到一个代表纹理的NSImage,而不是源文件名本身。

它必须在某处 - 在XCode的collada查看器的检查器中,还会显示文件名(以及来自SCNMaterialProperty的属性):

enter image description here

如何在SceneKit对象图中访问纹理的文件名?

1 个答案:

答案 0 :(得分:1)

它没有API。如果您对调试目的纯粹感兴趣,那么攻击并不困难:底层SCNMaterialProperty是C3DImageRef,您可以使用-[SCNMaterialProperty getC3DImageRef]检索它。它的布局看起来像:

struct __C3DImage {
  void *isa;
  uint32_t junk;
  uint32_t retainCount;
  NSDictionary *entityProperties;  // e.g. contains the kIDKey.  Nothing else for a material property.
  NSURL *path;
  ...
}

因此,通过一些投射和偏移,你可以抓住路径。请注意,由于指针大小的变化,32位与64位的偏移量会发生变化。

所有这些信息都可以从class-dump闪烁(并且可以生成包含确切结构等的标题)。虽然这一切都非常脆弱,所以不要发送使用它的代码。提交错误报告,请求添加API以正确获取此信息。