0

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

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

我希望纹理的文件名存储在 SCNMaterialProperty 类的实例中。从文档中:

SCNMaterialProperty 类封装了一个纹理和一组属性,这些属性指定了如何将纹理应用到对象上。

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

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

在此处输入图像描述

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

4

1 回答 1

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 位的偏移量会发生变化。

所有这些信息都可以从类转储中获得(并且可以生成包含确切结构等的标头)。不过,这一切都非常脆弱,所以永远不要发布使用它的代码。提交错误报告,请求添加 API 以正确获取此信息。

于 2012-11-18T06:37:33.103 回答