将collada(dae)文件加载到SCNNode(Swift-SceneKit)中

将collada(dae)文件加载到SCNNode(Swift-SceneKit)中,swift,collada,scenekit,Swift,Collada,Scenekit,这很有效 let scene = SCNScene(named: "house.dae") 节点是否有等效项 let node = SCNNode(geometry: SCNGeometry( ..??.. "house.dae" ..??.. )) 我到处搜索,找不到可以将整个dae文件加载到SCNNode中的内容。(不仅仅是一个ID)从SCNScene(名:)获得的场景有一个rootNode属性,其子对象是加载的DAE文件的内容。您应该能够从该节点中提取子节点,并将它们添加到现有SCNS

这很有效

let scene = SCNScene(named: "house.dae")
节点是否有等效项

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

我到处搜索,找不到可以将整个dae文件加载到SCNNode中的内容。(不仅仅是一个ID)

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

iOS 9引入了
SCNReferenceNode
类。现在您可以执行以下操作:

// 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()
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!)
   }
}

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

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")

请注意,不能将一个场景的
rootNode
移动到另一个场景中。您需要拉出一个子节点。谢谢,我不知道。更新的答案。可能是重复的。这里的答案是正确的。(加载整个dae文件,而不仅仅是其中的一个ID)最佳答案!