2015-02-04 4 views
8

Я посмотрел на игру Banana от WWDC, которая написана в Objective - C пыталась преобразовать код в swift для импорта анимации и перехода между ними, но у меня возникают проблемы с анимацией в быстром из DAE файлы.Добавление и переход анимаций в SceneKit

У меня есть файлы DAE экспортера в формате AutoDesk от 3DSMAx и в формате openCollada. Autodeskformat анимация для каждой кости, поэтому я не могу назвать анимацию по имени, поэтому я просто импортирую сцену и делаю следующее для запуска анимации, как только загружается файл.

scene = SCNScene(named: "monster.scnassets/monsterScene.DAE") 
    scene2 = SCNScene(named:"monster.scnassets/monster.DAE") 

    var heroNode = SCNNode() 
    heroNode = scene.rootNode.childNodeWithName("heroNode", recursively: false)! 

    var nodeArray = scene2.rootNode.childNodes 
     for childNode in nodeArray { 
     heroNode.addChildNode(childNode as SCNNode) 
    } 

Хотя анимация воспроизводится, как только начинается сцена, я знаю, как хранить анимацию.

Если я экспортирую файл collada с помощью openCollada. Я могу использовать следующее, чтобы запустить get и запустить анимацию, поскольку в случае формата Collade AutoDesk есть только одна анимация для всего объекта, а не для каждой кости. Таким образом, я могу сохранить анимацию также с помощью CAAnimation.

 var anim = scene2.rootNode.animationForKey("monster-1") 
     childNode.addAnimation(anim, forKey: "monster-1") 

Но тогда символ пробегает под углом, а также бежит туда-сюда, а не работает в одном и том же месте.

Также лучше использовать освещение openCollada. Я просто хотел бы использовать openCollada вместо экспорта autodesk collada. Сейчас я использую формат openCollada для экспорта сцены и autodesk для экспорта символа.

Как сохранить анимацию в SceneKit быстро и переход между ними? Благодарю. : D

ответ

13

Если вы не изменяете параметры по умолчанию при загрузке сцены из файла, все анимации на сцене немедленно и автоматически присоединяются к их целевым узлам и воспроизводятся. (См. Ссылку Animation Import Options в справочной системе SceneKit.)

Если вы хотите загрузить анимацию из файла сцены и удержать их для присоединения к узлам (то есть, играть) позже, вам лучше загружать их с классом SCNSceneSource. Кроме того, вы можете (но не обязательно) хранить свою базовую модель в одном файле и анимации в других файлах.


Просто посмотрите на этот код загрузки анимации бананов. Просто посмотри на это. *

// In AAPLGameLevel.m: 
SCNNode *monkeyNode = [AAPLGameSimulation loadNodeWithName:nil fromSceneNamed:@"art.scnassets/characters/monkey/monkey_skinned.dae"]; 
AAPLMonkeyCharacter *monkey = [[AAPLMonkeyCharacter alloc] initWithNode:monkeyNode]; 
[monkey createAnimations]; 

// In AAPLSkinnedCharacter.m (parent class of AAPLMonkeyCharacter): 
+ (CAAnimation *)loadAnimationNamed:(NSString *)animationName fromSceneNamed:(NSString *)sceneName 
{ 
    NSURL *url = [[NSBundle mainBundle] URLForResource:sceneName withExtension:@"dae"]; 
    SCNSceneSource *sceneSource = [SCNSceneSource sceneSourceWithURL:url options:nil ]; 
    CAAnimation *animation = [sceneSource entryWithIdentifier:animationName withClass:[CAAnimation class]]; 
    //... 
} 

// In AAPLMonkeyCharacter.m: 
- (void)update:(NSTimeInterval)deltaTime 
{ 
    // bunch of stuff to decide whether/when to play animation, then... 
    [self.mainSkeleton addAnimation:[self cachedAnimationForKey:@"monkey_get_coconut-1"] forKey:nil]; 
    //... 
} 

Что происходит здесь:

  1. Там есть пользовательский класс управления анимированного персонажа. Он владеет SCNNode, содержащим модель персонажа, а также связку CAAnimation s для всех вещей, которые может сделать модель (простоя/прыжка/броска/etc).
  2. Этот класс инициализируется передачей символьного узла, загруженного из одного файла DAE. (AAPLGameSimulation loadNodeWithName:fromSceneNamed: - это удобная обертка вокруг загрузки SCNScene из файла и захвата именованного узла из нее.) Этот DAE-файл содержит только модель символа без анимации.
  3. Затем AAPLMonkeyCharacter загружает (и сохраняет ссылки на) необходимые анимации из отдельных файлов DAE, содержащих каждую анимацию. Здесь вводится SCNSceneSource - он позволяет захватывать анимацию из файла без их воспроизведения.
  4. Когда пришло время играть, класс обезьян вызывает addAnimation:forKey:, чтобы запустить анимацию на своем главном узле.

Переводя Свифта и применяя к вашей проблеме - где вы, кажется, есть все анимации в том же файле - я бы сделал что-то вроде этого (смутные очертания гипотетического класса):

class Monster { 
    let node: SCNNode 
    let attackAnimation: CAAnimation 

    init() { 
     let url = NSBundle.mainBundle().URLForResource(/* dae file */) 
     let sceneSource = SCNSceneSource(URL: url, options: [ 
      SCNSceneSourceAnimationImportPolicyKey : SCNSceneSourceAnimationImportPolicyDoNotPlay 
     ]) 
     node = sceneSource.entryWithIdentifier("monster", withClass: SCNNode.self) 
     attackAnimation = sceneSource.entryWithIdentifier("monsterIdle", withClass: CAAnimation.self) 
    } 

    func playAttackAnimation() { 
     node.addAnimation(attackAnimation, forKey: "attack") 
    } 
} 

ключевые биты:

  • SCNSceneSourceAnimationImportPolicyDoNotPlay гарантирует, что узлы, загруженные из источника сцены не начать с анимацией прикрепленными/воспроизведения.
  • Нужно загрузить анимацию отдельно entryWithIdentifier:withClass:. Обязательно настройте их, как вам нравится (повторение, длительность затухания и т. Д.) Перед присоединением к узлам.
+0

Спасибо, что посмотрю. : D. sry can not даже повысит ваш ответ. Нужна 15 реп. –

Смежные вопросы