Загрузочный узел SceneKit с анимацией из отдельного файла scn

У меня есть представление, которое динамически создает SCNView. Это сцена пустая, но когда я нажимаю кнопку, я хотел бы добавить узел из отдельного файла scn. Этот файл содержит анимацию, и я хотел бы, чтобы он был одушевлен в главной сцене. Проблема в том, что после добавления объекта в сцену он не оживляет. Когда я использую этот файл в качестве сцены SCNView, он работает. isPlaying и loop включены. Что еще мне нужно сделать, чтобы импортировать такой узел с анимацией? Пример кода ниже:

override func viewDidLoad() { super.viewDidLoad() let scene = SCNScene() let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) sceneView.scene = scene sceneView.loops = true sceneView.isPlaying = true sceneView.autoenablesDefaultLighting = true view.addSubview(sceneView) let subNodeScene = SCNScene(named: "Serah_Animated.scn")! let serah = subNodeScene.rootNode.childNode(withName: "main", recursively: false)! scene.rootNode.addChildNode(serah) } 

Вам нужно извлечь анимацию из вашей сцены Serah_Animated.scn , которая будет объектом CAAnimation . Затем вы добавляете этот объект анимации в rootNode вашей основной сцены.

 let animScene = SCNSceneSource(url:<<URL to your scene file", options:<<Scene Loading Options>>) let animation:CAAnimation = animScene.entryWithIdentifier(<<animID>>, withClass:CAAnimation.self) 

Вы можете найти animID из файла .scn используя редактор сцен в Xcode, как показано ниже.

SceneKit AnimationID из редактора сцены Xcode

Теперь вы можете добавить объект анимации к корневому узлу.

 scene.rootNode.addAnimation(animation, forKey:<<animID>>) 

Обратите внимание, что мы повторно используем animID, что позволит вам также удалить анимацию из узла.

 scene.rootNode.removeAnimation(forKey:<<animId>>) 
  • Мое решение выше предполагает, что ваша анимация – это одна анимация. Если вы видите кучу анимаций, вам нужно добавить все узлы анимации. В моем рабочем процессе у меня есть файлы в Blender, которые я экспортирую в формат Collada, а затем использую Automated Collada Converter, чтобы гарантировать, что у меня есть отдельные узлы анимации.
  • Похожие ответы SO
  • Вы также animID запрограммировать animID с помощью entriesWithIdentifiersOfClass(CAAnimation.self) , полезно, когда у вас есть куча анимаций, а не одна анимация, как указано выше, или если вы просто хотите добавить анимацию, не беспокоясь об animID перед рукой.
  • Пример кода Apple для анимации набора сюжетов, обратите внимание, что пример кода находится в ObjC, но перевод на Swift должен быть прямым.

Все, что вам нужно – это получение анимаций:

  [childNode enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) { for(NSString *key in child.animationKeys) { // for every animation key CAAnimation *animation = [child animationForKey:key]; // get the animation animation.usesSceneTimeBase = NO; // make it system time based animation.repeatCount = FLT_MAX; // make it repeat forever [child addAnimation:animation forKey:key]; // animations are copied upon addition, so we have to replace the previous animation } }]; 
  • Медленная работа Scenekit
  • Как я могу экспортировать простую фальсифицированную модель Maya для использования в Scenekit?
  • Космическая камера Scenekit вокруг объекта
  • Как вращать SCNSphere с помощью распознавателя жестов
  • SceneKit, направление смены SCNMaterial
  • удаление SCNNode не освобождает память перед созданием нового SCNNode
  • Сцена SCNRender с анимированными объектами
  • Бросить тень на все узлы SCNLight
  • Перенос глобальной в локальную позицию узла в SceneKit
  • как конвертировать файлы .dae в .scn в SceneKit
  • Создание сквозного портала в SceneKit
  • Interesting Posts
    Давайте будем гением компьютера.