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

问题描述 投票:6回答:4

这有效

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

是否有节点的等价物?

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

我已经搜索了高低,找不到任何将整个dae文件加载到SCNNode中的内容。 (不只是一个ID)

swift collada scenekit
4个回答
11
投票
// 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()

8
投票

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

4
投票

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

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

2
投票

您从SCNScene(named:)获得的场景有一个rootNode属性,其子项是您加载的DAE文件的内容。您应该能够从该节点拉出子节点并将其添加到现有SCNScene中的其他节点。

© www.soinside.com 2019 - 2024. All rights reserved.