将Collada(DAE)文件加载到SCNNode中(Swift-SceneKit)

10

这是有效的

let scene = SCNScene(named: "house.dae")

有没有节点的等价物?

let node = SCNNode(geometry: SCNGeometry( ..??.. "house.dae" ..??.. ))

我已经四处搜寻,但没有找到能够将整个dae文件加载到一个SCNNode中的方法。(而不仅仅是其中的一个ID)


也许吧。虽然这里的答案是正确的,但是需要加载整个dae文件,而不仅仅是其中一个ID。 - quemeful
关于这个十年老问题,我担心现在唯一的方法就是按照这里所解释的方式:https://dev59.com/4F8e5IYBdhLWcg3wyM7N#75088130。只需用文本编辑器浏览文件,然后就可以轻松顺畅地完成了。 - Fattie
4个回答

13
// add a SCNScene as childNode to another SCNScene (in this case to scene)
func addSceneToScene() {
    let geoScene = SCNScene(named: "art.scnassets/ball.dae")
    scene.rootNode.addChildNode(geoScene.rootNode.childNodeWithName("Ball", recursively: true))
}
addSceneToScene()

11

iOS 9引入了SCNReferenceNode类。现在你可以这样做:

if let filePath = Bundle.main.path(forResource: "Test", ofType: "dae", inDirectory: "GameScene.scnassets") {
   // ReferenceNode path -> ReferenceNode URL
   let referenceURL = URL(fileURLWithPath: filePath)

   if #available(iOS 9.0, *) {
      // Create reference node
      let referenceNode = SCNReferenceNode(URL: referenceURL)
      referenceNode?.load()
      scene.rootNode.addChildNode(referenceNode!)
   }
}

最佳答案! - imike

5

这是我在实际项目中使用的:

extension SCNNode {

    convenience init(named name: String) {
        self.init()

        guard let scene = SCNScene(named: name) else {
            return
        }

        for childNode in scene.rootNode.childNodes {
            addChildNode(childNode)
        }
    }

}

之后,您可以调用以下内容:

let node = SCNNode(named: "art.scnassets/house.dae")

1

SCNScene(named:)方法返回的场景具有一个rootNode属性,其子节点是您加载的DAE文件的内容。您应该能够从该节点中获取子节点并将它们添加到现有SCNScene中的其他节点中。


2
请注意,您无法将一个场景的rootNode移动到另一个场景中。您需要取出一个子节点来代替。 - rickster
谢谢,我不知道。已更新答案。 - Noah Witherspoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接