Я хочу воспроизвести и приостановить анимацию в формате 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
анимации.