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 以进行联合操作
Android 将 FBX 或 Collada(.dae) 加载到 Android Studio Activity 中