ios swift scenekit collada

¿Cómo cargar un archivo.dae en un SCNNode en SceneKit de iOS?



swift collada (6)

¡Gracias por tu ayuda!

Aquí hay una clase simple de collada2nodo.

//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 }

Tengo problemas para comprender cómo se debe cargar la geometría de los archivos .dae en un gráfico de escena de SceneKit para iOS.

Sé que puedes cargar archivos .dae directamente en un SCNScene:

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

También sé que puede crear un SCNScene vacío y agregar objetos 3D incorporados en él como nodos secundarios:

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

En el segundo caso, ¿puede cargar un archivo .dae en SCNNode en lugar de usar objetos integrados? ¿O se espera que todos los archivos .dae deban cargarse primero en el SCNScene?

Si esto último es cierto, ¿cómo colocan los objetos de SCNNode en el lugar correcto en la jerarquía del gráfico de la escena en SCNScene? EDIT # 1:

Esto está funcionando para mí ahora, que es una versión modificada de lo que sugirió @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))

Pero tal vez hay una mejor manera? Lo anterior implica cargar manualmente cada identificador desde el árbol .dae. En mi archivo, hay un nodo "SketchUp" con identificadores secundarios "ID2" e "ID10". Este método no te permitirá cargar la raíz "SketchUp". (Me sale un error de tiempo de ejecución.)


El patrón habitual es cargar su escena y recuperar el nodo que le interesa con su nombre usando

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

Entonces puedes reparar este nodo en tu escena principal.


Las siguientes respuestas no funcionaron para mí.

Esto es lo que me funcionó en Xcode 7.0 beta 5, iOS 9.0 beta / Swift 2.0:

Tipo de modelo 3D: Collada Nombre del modelo 3D: "model.dae"

  1. Carga la escena:

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

  2. Acceda al SCNode hijo que está en el SCNScene:

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

  3. Agregue el nodo de la lámpara de la escena cargada a la escena cargada y vista actual:

    self.scene.rootNode.addChildNode(lampRootNode!)

NOTA: El self.scene existe debido a:

private var scene:SCNScene!

Antes de agregar el objeto a la escena, he realizado algunos ajustes de escena de acuerdo con el ejemplo del kit de escena. Si necesitas el código indícalo en los comentarios.

Espero eso ayude.


Tuve un problema similar en el que tenía un archivo .dae y quería cargar varios nodos de ese archivo en un nodo. Esto funcionó para mí:

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

Primero, establezco un nodo que lo mantendrá todo junto para que se vea como lo hace en el archivo original. A continuación, importamos el archivo .dae que deseamos y copiamos todos los nodos que contiene. Por último, para cada nodo de la matriz, lo agregué al nodo.


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


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