我想在MacOS上使用SceneKit来加载Collada文件并获取场景节点属性,以便将它们与我自己的场景图一起使用。
我可以轻松访问顶点,法线,变换矩阵,材质属性等 - 除纹理文件名外的所有内容。
我希望纹理的文件名存储在SCNMaterialProperty Class的实例中。来自文档:
SCNMaterialProperty类封装了一个纹理和一组 指定如何在对象上应用纹理的属性。
但是我只能得到一个代表纹理的NSImage,而不是源文件名本身。
它必须在某处 - 在XCode的collada查看器的检查器中,还会显示文件名(以及来自SCNMaterialProperty的属性):
如何在SceneKit对象图中访问纹理的文件名?
答案 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以正确获取此信息。