似乎大多数3D创作应用程序使用Z作为“向上”轴.而SceneKit使用Y作为’向上’轴. SceneKit允许您将场景加载为Collada .DAE文件.通过以下任一方式加载场景时:
SCNScene(named: String?,inDirectory: String?,options: [NSObject : AnyObject]?)
要么
SCNSceneSource(URL url: NSURL!,options: [NSObject : AnyObject]!)
您可以指定选项,包括SCNSceneSourceConvertToYUpKey和SCNSceneSourceConvertUnitsToMetersKey.
相应地设置这些,我期望当我将它们添加到从加载场景中的节点构造的我自己的场景中时,各个节点被变换和缩放.但这些选项似乎没有效果.
let myScene = SCNScene(named: "Scene.dae",inDirectory: nil,options: [SCNSceneSourceConvertToYUpKey:true,SCNSceneSourceConvertUnitsToMetersKey:25.4])
我误解了这些选项参数的含义吗?
解决方法
SceneKit不直接在iOS上加载DAE(或ABC)文件 – 它从私有Apple格式加载场景,当您在项目中包含场景文件时,Xcode会自动转换为该格式.此转换的一部分是变换向上轴的选项.
当您只是将DAE文件包含为捆绑资源时,我不相信该选项会暴露出来. (可能是a good bug to file.)但是,最好使用新的SceneKit资源目录功能,无论如何 – 将DAE文件和任何外部资源(纹理)放入扩展名为.scnassets的文件夹中,Xcode将处理它们一起在构建时优化目标设备.然后,当您在Xcode导航器中选择该文件夹时,您将获得场景构建选项的编辑器:
所有的盒子都很好检查. :)(因为第一个没有解释:交错意味着组织几何的顶点数据,因此您可以获得更好的GPU内存位置,以便在顶点处理期间减少缓存未命中,这对于嵌入式设备的性能非常重要.)
嗯,我在那里看不到任何关于单位的事情.可能是another good bug to file.
还有另一种选择 – 所有SceneKit对象都实现了NSSecureCoding协议,因此您可以在OS X上加载和预处理场景,然后使用NSKeyedArchiver将其写出来.将生成的文件作为捆绑资源包含在iOS项目中,Xcode不会对其进行预处理(它已经过压缩和优化) – 如果您使用.scn扩展名来命名,则可以使用所有用于加载它的SCNScene和SCNSceneSource方法就像(预处理的)DAE文件一样.