2016-05-30 38 views
4

がmorphersためWWDC 2013 What's new in SceneKitターゲットジオメトリによる.DAEファイルに含まれていることができます。すべてのモーフィング情報やアニメーションは、DAEファイルから読み込むことができるか、プログラムですべてのものを作成することができますColladaの.daeファイルのモーフコントローラからSceneKitにSCNMorpherターゲットをロードするにはどうすればよいですか?

私は、モーフィングコントローラを含むcolladaの.daeファイルを持っています。このファイルは、BlenderのColladaエクスポータによって作成され、Include Shape Keysが選択されています。メインジオメトリの後にリストされているシェイプキーは<library_geometries>です。次のようになります。Restがシェイプキーの名前です

<geometry id="Octopus-mesh_morph_Rest" name="Rest"> 
    <mesh> 
    <source id="Octopus-mesh_morph_Rest-positions"> 

。シェイプキー/モーフターゲットのジオメトリがこのヘッダーの後に続きます。すべてのジオメトリを定義した後

<library_controllers>があります:

<library_controllers> 
<controller id="Octopus-morph" name="Octopus-morph"> 
    <morph source="#Octopus-mesh" method="NORMALIZED"> 
    <source id="Octopus-targets"> 
     <IDREF_array id="Octopus-targets-array" count="1">Octopus-mesh_morph_Rest</IDREF_array> 
     <technique_common> 
     <accessor source="#Octopus-targets-array" count="1" stride="1"> 
      <param name="IDREF" type="IDREF"/> 
     </accessor> 
     </technique_common> 
    </source> 
    <source id="Octopus-weights"> 
     <float_array id="Octopus-weights-array" count="1">0</float_array> 
     <technique_common> 
     <accessor source="#Octopus-weights-array" count="1" stride="1"> 
      <param name="MORPH_WEIGHT" type="float"/> 
     </accessor> 
     </technique_common> 
    </source> 
    <targets> 
     <input semantic="MORPH_TARGET" source="#Octopus-targets"/> 
     <input semantic="MORPH_WEIGHT" source="#Octopus-weights"/> 
    </targets> 
    </morph> 
</controller> 
</library_controllers> 

私はSceneKit内からこれらのモーフコントローラにアクセスするにはどうすればよいですか? Xcodeシーンエディタでは、モーフィングコントローラが認識されていることを示す表示はありません。たとえば、押すと再生は行われず、アニメーションフォルダは空になります。また、ベースジオメトリ以外の追加のジオメトリはありません。

ノードをロードするとき、ノードにはmorpherプロパティが関連付けられておらず、アニメーションキーもありません。私は "Rest"という名前のエントリをツリーで検索しようとしましたが、何もありません。

let collada = SCNScene(named: "octopus.dae", inDirectory: "art.scnassets", options: nil) 
    let octopus = collada?.rootNode.childNodeWithName("Octopus", recursively: true) 
    octopus?.position = SCNVector3(0,-2,0) 
    print(octopus?.morpher?.animationKeys) //nil 
    print(octopus?.animationKeys) //Optional([]) 

Collada .daeファイルのモーフコントローラからSCNMorpherターゲットをロードできた人はいますか?それはBlenderの.dae輸出業者の問題かもしれませんか?客観的なCの答えだけでなく、迅速な歓迎。ありがとう。

EDIT

私もそれが違いを作るかどうかを確認するために、.DAEをロードするためにNSBundleを使用して、両方の内側とart.scnassetsフォルダの外.DAEを配置しようとしたが、まだサイコロない:

let collada = NSBundle.mainBundle().URLForResource("octopus", withExtension: "dae")! 
    let sceneSource = SCNSceneSource(URL: collada, options: [ 
     SCNSceneSourceAnimationImportPolicyKey : SCNSceneSourceAnimationImportPolicyDoNotPlay 
     ]) 
    let octopusDae = sceneSource?.entryWithIdentifier("Octopus", withClass: SCNNode.self) 
    //let deform = sceneSource?.entryWithIdentifier("Rest", withClass: SCNGeometry.self) 
      print(sceneSource?.entriesPassingTest(){(entry, id, stop) in return id.containsString("Rest") }) 
    print(octopusDae!.morpher) 
    print(octopusDae!.animationKeys) 

EDIT 2

私は、各形状キーを別々の.objファイルとして保存することによって、.objファイルでこれを処理することができました。しかし、私は本当にこれを、Blenderの.daeファイルで動作させたいのです。それは、繰り返しの開発を行い、たくさんのシェイプ・キーを持つモデルを使って作業することです(さらに、SceneKitの.objファイルを扱う際にいくつかの変わった欠点があります例えば、すべてのテクスチャ座標が垂直方向に反転しているように見えます)。私が必要とするすべてのジオメトリは.daeファイルにあります。私はそれを見るためにSceneKitを得ることができません。

答えて

3

Blenderはinstance_controllersを必要とするノードの下に記述していません。 Blenderの問題:T50807を参照してください。

シェイプキーからSCNMorphersをロードするだけの場合は、影響を受けるノードのinstance_geometry要素を、library_controllersの下の適切なエントリを参照するinstance_controllerに置き換えることができます。

<node id="Cube" name="Cube" type="NODE"> 
    <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix> 
    <instance_geometry url="#Cube-mesh" name="Cube"> 
     <bind_material> 
     <technique_common> 
      <instance_material symbol="Material-material" target="#Material-material"/> 
     </technique_common> 
     </bind_material> 
    </instance_geometry> 
    </node> 

は次のようになります。

<node id="Cube" name="Cube" type="NODE"> 
    <matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix> 
    <instance_controller url="#Cube-morph" name="Cube-morph"> 
     <bind_material> 
     <technique_common> 
      <instance_material symbol="Material-material" target="#Material-material"/> 
     </technique_common> 
     </bind_material> 
    </instance_controller> 
    </node> 

SceneKitは、独自の問題があります。私が知る限り、SCNSkinner(別名Blenderアーマチュア)とSCNMorhper(別名Blenderシェイプキー)の両方を持つノードを持つColladaファイルは正しくインポートされません。 Blenderはこれをエクスポートしませんが、Collada CTSテストファイルを使用して問題を確認できます。 Morph_on_skin、skin_on_morph、morph_on_morphはすべてSceneKitに問題があります。

SCNMorphersが欠落しているという単純なケースを修正するツールを作成しました。それはここに見つけることができます:https://github.com/JonAllee/ColladaMorphAdjuster

+0

ヘイジョン、素晴らしい作品。それは本当に私の問題を解決しました。モデルのファイルサイズが劇的に増えた(5MBから100MB)ことを認識しました。私のモデルには、表情のためのシェイプ・キーがたくさんあります。インスタンスコントローラの追加は実際にファイルサイズに大きな影響を与えますか? –

+0

Jon、アーマチュアとシェイプキーのブレンドは、ツールを使用するときに実際には機能しないか正しく翻訳されませんか?私はシェイプキーを使って修正したdaeを手に入れようとしなかった。 – user2153553

関連する問題