根據對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看到它。
嘿喬恩,偉大的工作。這真的解決了我的問題。我意識到,我的模型文件大小顯着增加(5mb到100mb)。我的模型有很多面部表情的形狀鍵(約50我認爲)。添加實例控制器是否真的對文件大小有如此大的影響? –
喬恩,你的意思是在使用你的工具時混合銜鐵和形狀鍵實際上不能正確工作或翻譯?我試過了,並沒有通過shapekey得到更正的dae。 – user2153553