web-dev-qa-db-ja.com

iOS SceneKitでSdaNodeに.daeファイルをロードするにはどうすればよいですか?

.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」をロードできません。 (実行時エラーが発生します。)

20
M-V

通常のパターンは、シーンをロードし、興味のあるノードをその名前で取得することです

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

次に、このノードをメインシーンの親に変更できます。

11
Toyos

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ファイルをインポートし、その中のすべてのノードをコピーします。最後に、配列内の各ノードについて、ノードに追加しました。

10

ご協力いただきありがとうございます!

これは単純な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
}
7
rabie jegham

次の答えは私にはうまくいきませんでした。

Xcode 7.0 beta 5、iOS 9.0 beta/Swift 2.0:

3Dモデルタイプ: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!

オブジェクトをシーンに追加する前に、シーンキットの例に従っていくつかのシーンをセットアップしました。コードが必要な場合は、コメントに記載してください。

それが役に立てば幸い。

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

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