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

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

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

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

我也知道你可以创build一个空的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:

这现在对我来说是工作的,这是@FlippinFunbuild议的修改版本。

 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树中的每个标识符。 在我的文件中,有一个带有子标识符“ID2”和“ID10”的节点“SketchUp”。 这个方法不会让你加载根目录“SketchUp”。 (我得到一个运行时错误。)

通常的模式是加载你的场景,并使用它的名字来检索你感兴趣的节点

[scene.rootNode childNodeWithName:aNamerecursion:YES];

然后将这个节点重新分配给你的主场景。

我有一个类似的问题,我有一个.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文件,并复制其中的所有节点。 最后,对于arrays中的每个节点,我将它添加到节点。

谢谢你的帮助!

这是一个简单的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 } 
 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() } } 

以下答案不适合我。

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

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

  1. 加载场景:

    let lampScene = SCNScene(named: "art.scnassets/model.dae")

  2. 访问SCNScene中的子SCNode:

    let lampRootNode = lampScene?.rootNode.childNodes[0]

  3. 将加载的场景中的灯节点添加到当前加载和查看的场景中:

    self.scene.rootNode.addChildNode(lampRootNode!)

注意: self.scene存在的原因是:

 private var scene:SCNScene! 

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

希望能帮助到你。