7

似乎大多数 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])

我是否误解了这些选项参数的含义?

4

1 回答 1

10

SceneKit 不直接在 iOS 上加载 DAE(或 ABC)文件——它从私有 Apple 格式加载场景,当您在项目中包含场景文件时,Xcode 会自动将其转换为该格式。此转换的一部分是转换上轴的选项。

我不相信当您简单地将 DAE 文件包含为捆绑资源时,该选项会暴露。(这可能是一个很好的归档错误。)但是,无论如何,最好使用新的 SceneKit 资产目录功能 - 将您的 DAE 文件和任何外部资源(纹理)放入带有.scnassets扩展名的文件夹和 Xcode将它们一起处理以在您构建时针对目标设备进行优化。然后,当您在 Xcode 导航器中选择该文件夹时,您将获得一个用于场景构建选项的编辑器:

SceneKit 资产目录选项

那里的所有盒子都很好检查。:) (因为第一个没有解释:交错意味着组织几何的顶点数据,以便在顶点处理期间获得更好的 GPU 内存局部性以减少缓存未命中,这对于嵌入式设备的性能很重要。)

嗯,不过,我没有看到任何关于那里的单位的信息。可能是另一个要归档的好错误

还有另一种选择——所有 SceneKit 对象都实现了该NSSecureCoding协议,因此您可以在 OS X 上加载和预处理场景,然后将NSKeyedArchiver其写出。将生成的文件作为捆绑资源包含在你的 iOS 项目中,Xcode 不会对其进行预处理(它已经尽可能地压缩和优化)——如果你用.scn扩展名命名它,你可以使用所有的SCNSceneSCNSceneSource方法像加载(预处理的)DAE 文件一样加载它。

于 2014-07-14T18:31:39.803 回答