首页 文章

如何将.dae文件加载到iOS SceneKit中的SCNNode中?

提问于
浏览
20

我无法理解应如何将 .dae 文件中的几何图形加载到iOS SceneKit场景图中 .

我知道你可以直接将 .dae 文件加载到SCNScene中:

// create a new scene
let scene = SCNScene("test.scnassets/test.dae")

我也知道你可以创建一个空的SCNScene并将内置的3D对象作为子节点添加到其中:

let scene = SCNScene()
var sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
scene.rootNode.addChildNode(sphereNode)

在第二种情况下,您可以将 .dae 文件加载到SCNNode而不是使用内置对象吗?或者是否需要首先将所有 .dae 文件加载到SCNScene中?

如果后者为真,那么如何将SCNNode对象放在SCNScene下的场景图层次结构中的正确位置?编辑#1:

这对我来说很有用,这是@FlippinFun建议的修改版本 .

let url = NSBundle.mainBundle().URLForResource("test.scnassets/test", withExtension: "dae")
let source = SCNSceneSource(URL: url, options: nil)
let block = source.entryWithIdentifier("ID10", withClass: SCNGeometry.self) as SCNGeometry
scene.rootNode.addChildNode(SCNNode(geometry: block))

但也许有更好的方法?以上涉及从.dae树手动加载每个标识符 . 在我的文件中,有一个节点“SketchUp”,子标识符为“ID2”和“ID10” . 此方法不允许您加载根“SketchUp” . (我收到运行时错误 . )

6 回答

  • 10

    通常的模式是加载场景并使用其名称检索您感兴趣的节点

    [scene.rootNode childNodeWithName:aName recursively:YES];
    

    然后,您可以将此节点重新显示到主场景 .

  • 3

    我有一个类似的问题,我有一个.dae文件,我想从该文件加载多个节点到一个节点 . 这对我有用:

    var node = SCNNode()
    let scene = SCNScene(named: "helloScene.dae")
    var nodeArray = scene.rootNode.childNodes
    
    for childNode in nodeArray {
      node.addChildNode(childNode as SCNNode)
    }
    

    首先,我设置了一个节点,它将所有节点保持在一起,因此它看起来像在原始文件中 . 接下来,我们导入我们想要的.dae文件并复制其中的所有节点 . 最后,对于阵列中的每个节点,我将其添加到节点 .

  • 7

    谢谢你的帮助!

    这是一个简单的collada2Node类 .

    //collada2SCNNode
    class func collada2SCNNode(filepath:String) -> SCNNode {
        var node = SCNNode()
        let scene = SCNScene(named: filepath)
        var nodeArray = scene!.rootNode.childNodes
    
        for childNode in nodeArray {
            node.addChildNode(childNode as SCNNode)
        }
        return node
    }
    
  • 3
    func nodeWithFile(path: String) -> SCNNode {
    
        if let scene = SCNScene(named: path) {
    
            let node = scene.rootNode.childNodes[0] as SCNNode
            return node
    
        } else {
            println("Invalid path supplied")
            return SCNNode()
        }
    
    }
    
  • 1

    以下答案对我不起作用 .

    以下是在Xcode 7.0 beta 5,iOS 9.0 beta / Swift 2.0中对我有用的内容:

    3D模型类型:Collada 3D模型名称:“model.dae”

    • 加载场景:
    let lampScene = SCNScene(named: "art.scnassets/model.dae")
    
    • 访问SCNScene中的子SCNode:
    let lampRootNode = lampScene?.rootNode.childNodes[0]
    
    • 将灯泡节点从加载的场景添加到当前加载和查看的场景中:
    self.scene.rootNode.addChildNode(lampRootNode!)
    

    NOTE: self.scene 由于存在:

    private var scene:SCNScene!
    

    在将对象添加到场景之前,我已根据场景工具包示例进行了一些场景设置 . 如果您需要代码,请在评论中提及 .

    希望能帮助到你 .

  • 11
    guard let shipScene = SCNScene(named: "ship.dae") else { return }
    let shipNode = SCNNode()
    let shipSceneChildNodes = shipScene.rootNode.childNodes
    for childNode in shipSceneChildNodes {
        shipNode.addChildNode(childNode)
    }
    

相关问题