Как я могу воспроизвести и приостановить анимацию COLLADA по умолчанию на определенных ключевых кадрах? - PullRequest
4 голосов
/ 08 мая 2019

Я хочу воспроизвести и приостановить анимацию в формате FBX. Я не смог найти способ заставить это работать, поэтому сначала я конвертирую файлы fbx в формат dae (COLLADA), который можно импортировать для использования в SceneKit.

Я загружаю dae файл, подобный этому, и добавляю его к ARAnchor, который был обнаружен ARKit (я не думаю, что это уместно, что я загружаю его в приложение AR).

func createNode() -> SCNNode {
    let node = SCNNode()

    // Instantiate the file
    let scene = SCNScene(named: file)!

    // Steal all their children
    scene.rootNode.childNodes.forEach { node.addChildNode($0) }

    // Scale the node
    node.scale = SCNVector3(scale, scale, scale)

    return node
}

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

Я заметил, что есть 3 animationKey s, которые содержатся в различных дочерних узлах узла, который я создаю:

  • BBCharacter01AA_BoneLPlatform-Matrix-анимация-преобразование
  • BBCharacter01AA_BoneRPlatform-Matrix-анимация-преобразование
  • безымянная анимация # 2

Я думаю, что безымянный является общим, поэтому я попытался удалить его, используя это на дочернем узле, который имеет анимацию:

node.removeAnimation(forKey: "unnamed animation #2", blendOutDuration: 0)

Когда это не сработало, я попытался удалить все анимации, которые смог найти с помощью animationKeys, но модель по-прежнему анимировалась.

Я также попытался создать экземпляр анимации отдельно и добавить ее с помощью CAAnimationGroup, у которого duration равно 0. Я читал, что добавление анимации с тем же ключом должно перезаписать ее, но это не выглядело чтобы остановить анимацию либо.

Я действительно в недоумении, понятия не имею, что делать дальше.

Редактировать: я попробовал метод removeAllAnimations на SCNNode, который я создаю. Но это тоже не работает.

Я попробовал sceneView.scene.isPaused = true, и это наконец работает! Я пытаюсь использовать способ, который использует время, когда модель была добавлена, и продолжительность, на которой она была приостановлена, чтобы попытаться выровнять обновления для isPaused анимации.

...