.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)
2番目のケースでは、組み込みオブジェクトを使用する代わりに、.dae
ファイルをSCNNodeにロードできますか?または、すべての.dae
ファイルを最初にSCNSceneにロードする必要があると予想されますか?
後者が当てはまる場合、SCNNodeオブジェクトをシーングラフ階層のSCNSceneの下の適切な場所にどのように配置しますか?
これは今私のために働いています。これは@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ツリーから各識別子を手動でロードします。私のファイルには、子識別子「ID2」と「ID10」を持つノード「SketchUp」があります。この方法では、ルート「SketchUp」をロードできません。 (実行時エラーが発生します。)
通常のパターンは、シーンをロードし、興味のあるノードをその名前で取得することです
[scene.rootNode childNodeWithName:aName recursively:YES];
次に、このノードをメインシーンの親に変更できます。
1つの.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ファイルをインポートし、その中のすべてのノードをコピーします。最後に、配列内の各ノードについて、ノードに追加しました。
ご協力いただきありがとうございます!
これは単純な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
}
次の答えは私にはうまくいきませんでした。
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!)
注:self.scene
の原因:
private var scene:SCNScene!
オブジェクトをシーンに追加する前に、シーンキットの例に従っていくつかのシーンをセットアップしました。コードが必要な場合は、コメントに記載してください。
それが役に立てば幸い。
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)
}