繁体   English   中英

SceneKit。 哪种方式起来了?

[英]SceneKit. Which way is up?

似乎大多数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文件包含为捆绑资源时,我不相信该选项会暴露。 (这可能是一个很好的文件错误 。)但是,最好使用新的SceneKit资源目录功能,无论如何 - 将DAE文件和任何外部资源(纹理)放入扩展名为.scnassets的文件夹中,和Xcode将一起处理它们以在构建时优化目标设备。 然后,当您在Xcode导航器中选择该文件夹时,您将获得场景构建选项的编辑器:

SceneKit资产目录选项

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

嗯,我在那里看不到任何关于单位的事情。 可能是另一个好的bug提交

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM