2016-05-30 47 views
4

根據對morphers WWDC 2013 What's new in SceneKit目標的幾何形狀可以包含在一個.dae文件:如何將Collada .dae文件的變形控制器的SCNMorpher目標加載到SceneKit中?

所有的變形信息和動畫可以從DAE文件裝入或者可以通過編程方式創造一切「

我有一個包含變形控制器的collada .dae文件,該文件由Blender的Collada導出器創建,並且選擇了「包含形狀鍵」,這將Blender的形狀鍵轉換爲Collada的變形控制器當我檢查生成的文件時,在主要幾何體<library_geometries>後列出的形狀鍵看起來像這樣:

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

其中Rest是形狀鍵的名稱。形狀鍵/變形目標的幾何形狀隨後在該頭部之後。

所有幾何定義後,有個<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場景編輯器中,沒有任何跡象表明變形控制器已被識別,例如,按下play不起作用,動畫文件夾爲空,並且除了基本幾何體之外沒有其他幾何體。

當我加載節點時,它沒有附加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出口商的問題嗎? Objective-C的回答以及Swift的歡迎。謝謝。

編輯

我使用NSBundle加載.dae,置.dae內部和art.scnassets文件夾之外,看它是否有差別也試過,但仍然沒有骰子:

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) 

編輯2

我設法通過.obj文件,通過將每個形狀鍵保存爲一個單獨的.obj文件來得到此工作。但是我真的很希望能夠與Blender的.dae文件一起工作,因爲它可以進行迭代開發,並且可以更輕鬆地處理帶有許多形狀鍵的模型(另外,在SceneKit中使用Blender .obj文件也有一些奇怪的怪癖,例如所有的紋理座標似乎都是垂直翻轉的)。我需要的所有幾何都在.dae文件中。我只是無法讓SceneKit看到它。

回答

3

Blender不會在需要它們的節點下編寫instance_controllers。請參閱攪拌器問題:T50807。

如果您只是想從形狀鍵中加載SCNMorphers,則可以使用引用library_controllers下相應條目的instance_controller替換受影響節點下的instance_geometry元素。

<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)。我的模型有很多面部表情的形狀鍵(約50我認爲)。添加實例控制器是否真的對文件大小有如此大的影響? –

+0

喬恩,你的意思是在使用你的工具時混合銜鐵和形狀鍵實際上不能正確工作或翻譯?我試過了,並沒有通過shapekey得到更正的dae。 – user2153553

相關問題