Swift 3 将 .dae 文件加载到 SCNNode

Posted

技术标签:

【中文标题】Swift 3 将 .dae 文件加载到 SCNNode【英文标题】:Swift 3 load .dae file into SCNNode 【发布时间】:2017-12-17 02:41:21 【问题描述】:

将 .dae 文件加载为场景元素

此代码有效,将文件加载为场景:

let scene = SCNScene(named: "art.scnassets/base-wall-tile_sample.dae")!

此代码将文件加载为 SCNGeometry,但不会:

let url = Bundle.main.url(forResource: "art.scnassets/base-wall-tile_sample", withExtension: "dae")
let source = SCNSceneSource(url: url! )
let geo = source!.entryWithIdentifier("Geo", withClass: SCNGeometry.self)!

url 和 source 没问题,但它在尝试生成地理时崩溃。糟糕的指示。

这段代码,就像网络上提供的几个示例一样,是在 Swift 2 (load a collada (dae) file into SCNNode (Swift - SceneKit)。我不得不将它调整到 Swift 3,并且似乎在翻译中丢失了一些东西。有人可以告诉我如何做到这一点东西对吗?

【问题讨论】:

【参考方案1】:

.dae 文件始终作为SCNScene 加载。您需要命名包含要添加的几何图形的节点。 你可以加载场景,过滤给定名称的节点并将其添加到场景中。

func addNode(named nodeName, fromSceneNamed: sceneName, to scene: SCNScene) 
    if let loadedScene = SCNScene(named: sceneName),
       let node = loadedScene.rootNode.childNode(withName: nodeName, recursivly: true) 
        scene.rootNode.addChildNode(node)
    

【讨论】:

效果很好,但我对答案感到惊讶。加载这样一个文件作为“场景”对于仅仅获取一个节点来说似乎非常繁重。 SceneKit 就是这样解释这些文件的。为了获得最佳性能,您应该将它们放在.scnassets 文件夹中,Xcode 会在编译时为您优化它们。查看SCNSceneSource 了解更多信息和选项。 谢谢,orangenkopf。这看起来很有希望。现在,我一直无法理解这些“URL”的东西,它们并不总是真正的 URL。我将如何初始化 URL 以按照他们的建议访问我的 .scnassets 文件夹中的文件?如果有一些基本的地方我应该阅读以理解这些 URL,请指出它。 对于 URL(以及所有重新升级 SDK 的问题),我推荐Apple documentation。对于场景,只需使用 init(named: "myScene", inDirectory: "myAssets.scnassets")【参考方案2】:
guard let shipScene = SCNScene(named: "ship.dae") else  return 
let shipNode = SCNNode()
let shipSceneChildNodes = shipScene.rootNode.childNodes
for childNode in shipSceneChildNodes 
    shipNode.addChildNode(childNode)

node.addChildNode(shipNode)

【讨论】:

以上是关于Swift 3 将 .dae 文件加载到 SCNNode的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .dae 文件加载到 iOS SceneKit 中的 SCNNode 中?

将 Collada dae 文件加载到 SceneKit 以进行联合操作

为什么我不能使用Swift 4加载Collada文件?

Android 将 FBX 或 Collada(.dae) 加载到 Android Studio Activity 中

为啥我不能使用 Swift 4 加载 Collada 文件?

Firebase Swift 3 使用 NSURLSession 将配置文件图像加载到 TableView