2016-03-30 22 views
1

.objファイルをロードしようとしています。どのようにロードされた後、secenekitは多くのサブメッシュを持つ巨大なジオメトリを持つ1つのノードしか生成しません。誰もがこの巨大なノードを多くのノードに分割する方法を知っています。各ノードは1つのサブメッシュフォームを元のノードとして所有していますか?私はそれらに別の物理学を適用する必要があります。前もって感謝します。SceneKitでは、1つのSCNNodeを複数のノードに分割する方法は?

私は、次の方法を試してみました:

  1. 手動での.objファイルを解析します。これは動作しますが、あまりにも多くのメモリを食べる
  2. ファイルをロードした後、私は巨大なノードを取得します。その後、I (.OBJファイルから取得)メッシュごと

     let geometry = SCNGeometry(sources: rootNode.geometry!.geometrySources, elements: [rootNode.geometry!.geometryElementAtIndex(count)]) 
         geometry.firstMaterial = rootNode.geometry!.materials[count] 
         let node = SCNNode(geometry: geometry) 
    

を行うこれも動作しますが、レンダリングのために長い時間がかかる、私は、各ノードの全体のソースをコピーしているためであると思います。

答えて

1

正しい結果を得るためのアプローチがいくつか見つかりましたが、実行時に時間がかかりすぎます。だから、それらを実行するが、事前にそれを行う。

補助プログラムで、手動のOBJ解析または要素ごとのジオメトリ検索を実行します。その結果をSCNScene(またはおそらくSCNNodes)にアーカイブします。あなたのパブリックプロジェクトにアーカイブ/アーカイブを埋め込みます。 .SCNファイルのアーカイブを保存すると、大きなOBJファイルを解析してインスタンス化するよりもはるかに高速になります。

シーンをファイルにアーカイブする機能があります。プロジェクトにファイルを埋め込み、テンプレートコードで宇宙船が開かれるようにファイルを開くか、Xcodeシーンエディタを使用してファイルを編集することができます。

func archiveToFile(fileName: String) -> Bool { 
    let data = NSKeyedArchiver.archivedDataWithRootObject(gameView!.scene!) 

    // Save data to file 
    let DocumentDirURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) 

    let fileURL = DocumentDirURL.URLByAppendingPathComponent(fileName).URLByAppendingPathExtension("scn") 
    print("FilePath:", fileURL.path) 

    if (!data.writeToURL(fileURL, atomically: true)) { 
     return false 
    } 
    return true 
} 
+0

こんにちはHalさん、ありがとうございます。これは良いアイデアのように思えますが、コンバータを書くためにかなりの時間を費やす必要があるようにも見えます。とにかく時間があればこれを試してみる。ありがとう。 – must

+0

あなたは既にコンバージョンコードを書いていると思いましたか?そこから、アーカイブステップを追加すると完了です。 –

+0

こんにちはHal。私がやったのは、.objファイルからデータを読み込み、sceneKit APIを使用してこれらのデータに従ってノードを作成することです。 .scnファイルをあらかじめ生成するには、.scnファイルの形式に関する知識が必要だと思います。 .scnファイルをコードで生成する方法はありますか?ありがとう。 – must

関連する問題