2016-05-30 9 views
4

Согласно WWDC 2013 What's new in SceneKit целевых геометрий Морферы может содержаться в файле .dae:Как загружать объекты SCNMorpher из контроллеров морфинга Collade .dae в SceneKit?

Все морфинг информации и анимации могут быть загружены из файла DAE или вы можете создать все программно «

.

У меня есть файл collada .dae, который содержит контроллеры морфинга. Файл был создан экспортером Collada от Blender, с выбранным «Include Shape Keys». Это преобразует ключи формы 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 нет признаков того, что контроллеры морфинга были распознаны, например, нажатие на воспроизведение ничего не делает, папка анимаций пуста, и кроме базовой геометрии нет дополнительных геометрий.

Когда я загружаю узел, он не имеет прикрепленного объекта morpher и никаких кнопок анимации. Я попытался найти дерево для записей с именем «Отдых», но ничего не существует.

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([]) 

Кому-нибудь удалось загрузить цели SCNMorpher из контроллеров морфинга файла Collada .dae? Может быть, это проблема с экспортером Blender .dae? Ответы Objective-C, а также приветствие Swift. Благодарю. не

EDIT

Я также попытался использовать 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) 

EDIT 2

мне удалось получить эту работу с .obj файлов, экономя каждую форму ключ в виде отдельного файла .obj. Но мне бы очень хотелось, чтобы эта работа работала с файлами Blade .dae, так как это сделало бы итеративную разработку и работало бы с моделями с большим количеством клавиш формы, что намного проще (плюс, есть некоторые странные причуды для работы с файлами Blender .obj в SceneKit , например, все координаты текстуры, по-видимому, перевернуты вертикально). Вся необходимая геометрия находится в файле .dae. Я просто не могу заставить SceneKit увидеть его.

ответ

3

Блендер не пишет экземпляры экземпляров под узлами, которые в них нуждаются. См. Вопрос Blender: T50807.

Если вы хотите загрузить SCNMorphers из ключей формы, вы можете заменить элементы 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 имеет свои собственные проблемы. Насколько мне известно, он не будет правильно импортировать файл Collada с узлом, в котором есть как SCNSkinner (aka Blender-арматура), так и SCNMorhper (он же клавиша формы Blender). Blender не будет экспортировать это, но вы можете увидеть эту проблему, используя тестовые файлы Collada CTS. У Morph_on_skin, skin_on_morph, morph_on_morph есть проблемы в SceneKit.

Я сделал инструмент, который фиксирует простой случай отсутствия SCNMorphers. Его можно найти здесь: https://github.com/JonAllee/ColladaMorphAdjuster

+0

Эй, Джон, БОЛЬШАЯ РАБОТА. Это действительно решило мою проблему. Я узнал, что размер файла моей модели был значительно увеличен (от 5 до 100 мб). У моей модели много ключей формы для мимики (около 50, я думаю). Действительно ли добавление контроллеров экземпляров оказывает такое большое влияние на размер файла? –

+0

Джон, вы имеете в виду, что Blend с арматурой и shapekeys на самом деле не будет работать или правильно переводиться при использовании вашего инструмента? Я пробовал и не получал исправленного dae с shapekeys. – user2153553