Пользовательские анимационные свойства в SceneKit

Я знаю, что можно создать настраиваемые анимационные свойства в Core Animation, но как насчет в OS X 10.8 SceneKit framework? SCNAnimatable, похоже, не показывает те же API, что CALayer делает для анимации свойств.

В моем приложении у меня есть подкласс SCNNode под названием Starfield, который я портировал из старого приложения OpenGL с помощью SCNNodeRendererDelegate. Starfields выставляют свойство GLfloat, называемое warpFactor:

@interface Starfield : SCNNode<SCNNodeRendererDelegate> {
    // other stuff that not really important for this question
    GLfloat warpFactor;
}

@property(nonatomic) GLfloat warpFactor;
@end

Но когда я пытаюсь добавить к нему анимацию, вот так:

CABasicAnimation *warp = [CABasicAnimation animationWithKeyPath:@"warpFactor"];
warp.toValue = @1.0;
warp.duration = 5.0;
[starfield addAnimation:warp forKey:@"warp"];

Я получаю следующее в консоли:

[SCNKit ERROR] warpFactor is not an animatable path (from <unnamed SCNNode 0x1016473c0, no children>)

Я знаю, что SceneKit совершенно новый, но кто-нибудь знает, как это сделать?

Ответ 1

SceneKit не поддерживает настраиваемый анимированный путь к ключам

Ответ 2

Обходной путь/взлома:

  • создать без геометрических node и анимировать некоторое анимационное свойство на этом node, например непрозрачность
  • используйте SCNSceneRendererDelegate, чтобы подключиться к соответствующему этапу процесса рендеринга и вручную обновить свое настраиваемое свойство со значением геометрии- меньше node анимированное свойство (обязательно прочитайте анимированное свойство из node presentationNode)

Это решение является уродливым, но позволяет синхронизировать анимацию настраиваемого свойства с другими анимациями через SCNTransaction или CAAnimationGroup