2014-12-05 4 views
1

Я ищу способ анимации спрайтов в SceneKit. После некоторых исследований я нашел способ Core Animation сделать это, что было бы идеально, поскольку мне нужно как можно больше контролировать анимацию.Анимация UVs в SceneKit

Я подготовил простую плоскую сетку, с ее УФ-лучами, ограниченным одним размером рамки спрайта. Таким образом, мне нужно было только оживить УФ по горизонтали. Я обнаружил, что соответствующий элемент матрицы материала ТРАНСФОРМА материала будет m14 (тот, который отвечает за горизонтальный перевод).

Однако, во время выполнения, SceneKit выплевывает обратно следующее сообщение об ошибке:

[SCNKit ERROR] geometry?.firstMaterial?.diffuse.contentsTransform.m14 is not an animatable path 

Это соответствующий код:

let spritesheetAnimation = CABasicAnimation(keyPath: "geometry?.firstMaterial?.diffuse.contentsTransform.m14") 
spritesheetAnimation.fromValue = 1 - 1/spritesheetFrameCount 
spritesheetAnimation.toValue = 0 
spritesheetAnimation.byValue = 1/spritesheetFrameCount 
spritesheetAnimation.duration = 1.0 
spritesheetAnimation.repeatCount = Float.infinity 

node.geometry?.insertMaterial(material, atIndex: 0) 
node.addAnimation(spritesheetAnimation, forKey: "SpritesheetAnimation") 

Любой имеющий опыт работы с этим? Я не знаю, есть ли более простой способ сделать это, или если я смотрю на это неправильно или что-то еще. Таким образом, любые указатели будут оценены!

ответ

0

Вы можете попробовать contentsTransform.translation.x -Core Animation довольно умна в отношении преобразований при работе со слоями, поэтому SceneKit также сможет справиться с этим.

+0

Посмотрел действительно многообещающий, такая же ошибка, к сожалению:/ –

+0

Bummer. Возможно, стоит записать ошибку, а затем: http://bugreport.apple .com –

+0

Спасибо. Я собираюсь подождать еще один, может быть, еще моя ошибка. –

3

Две проблемы здесь.

  1. CoreAnimation расширяет Animatable ключевых путей в структуры данных можно анимировать - то есть, вместо того, чтобы просто анимировать между одним полным CATransform3D и другими, это позволяет анимировать ключевой путь, который описывает некоторый элемент или атрибут преобразования (например, transform.translation.x).

    SceneKit этого не делает - вы можете только анимировать полные значения структуры. То есть вы можете только анимировать contentsTransform, а не contentsTransform.something, и для этого вам необходимо предоставить SCNMatrix4 как toValue/fromValue вашей анимации.

  2. Ключи ключей KVC не имеют ничего общего с опциями Swift, поэтому geometry?.firstMaterial?.diffuse.contentsTransform не является юридическим ключом. Потеряйте вопросительные знаки, и все должно быть в порядке.

Таким образом, ваш код должен выглядеть примерно так (непроверенный):

let spritesheetAnimation = CABasicAnimation(keyPath: "geometry.firstMaterial.diffuse.contentsTransform") 
let translation = SCNMatrix4MakeTranslation(1 - 1/spritesheetFrameCount, 0, 0) 
spritesheetAnimation.fromValue = NSValue(SCNMatrix4: translation) 
spritesheetAnimation.toValue = NSValue(SCNMatrix4: SCNMatrix4Identity) 
spritesheetAnimation.duration = 1.0 
spritesheetAnimation.repeatCount = .infinity 

Примечание вам нужно обернуть SCNMatrix4 в NSValue перейти к fromValue и toValue, потому что Swift не может автоматически преобразовать его как и для скалярных числовых типов.

Также обратите внимание, что вы можете использовать вывод типа для Float.infinity, если хотите.

+0

1. Я вроде как ожидал чего-то подобного. К сожалению, это все еще показывает ту же ошибку, rse ссылаясь на geometry.firstMaterial.diffuse.contentsTransform как не являющийся анимационным путем, который, по словам документации SceneKit, является .. 2. Также имел это в виду. Однако изменение этого не решило, поэтому я подумал, что буду играть в безопасности. Спасибо за объяснение! –

0

это должно работать:

  • удалить "?" от ключевого ресурса
  • перевести горизонтально, целевую M41 (не M14)

пусть spritesheetAnimation = CABasicAnimation (ключевой путь: «geometry.firstMaterial.diffuse.contentsTransform.m41")

[...]

SceneKit не разлагаются матрицы на компоненты, такие как „перевод/вращения/масштаба“, так что вы не можете использовать пути, как „contentsTransform.translation.x“. Но вы можете по-прежнему ориентировать матричные компоненты, такие как «contentsTransform.m41» в ваших явных ключевых путях анимации.

+0

Показывает ту же ошибку, боюсь. На самом деле не ожидал, что среда исполнения будет жаловаться на один компонент матрицы, а не на другой. Спасибо в любом случае :) –

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