【问题标题】:Swift 3 load .dae file into SCNNodeSwift 3 将 .dae 文件加载到 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,并且似乎在翻译中丢失了一些东西。有人可以告诉我如何做到这一点东西对吗?

【问题讨论】:

    标签: swift3 scenekit collada


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2014-10-10
      • 2015-06-10
      • 2017-05-16
      • 2018-08-10
      • 2015-01-12
      • 2018-03-12
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多