Je ne parviens pas à comprendre comment la géométrie des fichiers .dae
doit être chargée dans un graphique de scène iOS SceneKit.
Je sais que vous pouvez charger des fichiers .dae
directement dans un SCNScene:
// create a new scene
let scene = SCNScene("test.scnassets/test.dae")
Je sais également que vous pouvez créer un SCNScene vide et y ajouter des objets 3D intégrés en tant que nœuds enfants:
let scene = SCNScene()
var sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
scene.rootNode.addChildNode(sphereNode)
Dans le second cas, pouvez-vous charger un fichier .dae
dans SCNNode au lieu d'utiliser des objets intégrés? Ou est-il prévu que tous les fichiers .dae
doivent d'abord être chargés dans le SCNScene?
Si ce dernier est vrai, comment placez-vous les objets SCNNode au bon endroit dans la hiérarchie du graphe de la scène sous SCNScene? EDIT # 1:
Cela fonctionne pour moi maintenant, ce qui est une version modifiée de ce que @FlippinFun a suggéré.
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))
Mais peut-être y a-t-il un meilleur moyen? Ce qui précède implique le chargement manuel de chaque identifiant à partir de l’arborescence .dae. Dans mon fichier, il y a un nœud "SketchUp" avec les identificateurs enfants "ID2" et "ID10". Cette méthode ne vous permettra pas de charger la racine "SketchUp". (Je reçois une erreur d'exécution.)
Le modèle habituel consiste à charger votre scène et à récupérer le nom du noeud qui vous intéresse avec son nom.
[scene.rootNode childNodeWithName:aName recursively:YES];
Ensuite, vous pouvez réparer ce noeud sur votre scène principale.
J'ai eu un problème similaire où j'avais un fichier .dae et je voulais charger plusieurs nœuds de ce fichier dans un nœud. Cela a fonctionné pour moi:
var node = SCNNode()
let scene = SCNScene(named: "helloScene.dae")
var nodeArray = scene.rootNode.childNodes
for childNode in nodeArray {
node.addChildNode(childNode as SCNNode)
}
Premièrement, je définis un nœud qui tiendra tout cela ensemble pour que cela ressemble à ce qu'il est dans le fichier original. Ensuite, nous importons le fichier .dae souhaité et copions tous les nœuds qu'il contient. Enfin, pour chaque nœud du tableau, je l'ai ajouté au nœud.
Merci de votre aide!
Voici une classe collada2Node simple.
//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
}
Les réponses suivantes n'ont pas fonctionné pour moi.
Voici ce qui a fonctionné pour moi dans Xcode 7.0 beta 5, iOS 9.0 beta/Swift 2.0:
Type de modèle 3D: Collada Nom du modèle 3D: "model.dae"
Chargez la scène:
let lampScene = SCNScene(named: "art.scnassets/model.dae")
Accédez au SCNode enfant qui se trouve dans le SCNScene:
let lampRootNode = lampScene?.rootNode.childNodes[0]
Ajoutez le noeud de lampe de la scène chargée dans la scène actuellement chargée et visualisée:
self.scene.rootNode.addChildNode(lampRootNode!)
NOTE: Le self.scene
existe en raison de:
private var scene:SCNScene!
Avant d’ajouter l’objet à la scène, j’ai fait quelques réglages de scène conformément à l’exemple de kit de scène. Si vous avez besoin du code, mentionnez-le dans les commentaires.
J'espère que ça aide.
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)
}