2012-07-31 19 views
10

Sé que es posible crear custom animatable properties in Core Animation, pero ¿qué ocurre con el marco SceneKit de OS X 10.8? SCNAnimatable no parece exponer las mismas API que CALayer para hacer que las propiedades sean animables.Propiedades animables personalizadas en SceneKit

En mi aplicación, tengo una subclase SCNNode llamada Starfield, que he portado desde una aplicación OpenGL anterior mediante el uso de SCNNodeRendererDelegate. Starfields exponer una propiedad GLfloat llama warpFactor:

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

@property(nonatomic) GLfloat warpFactor; 
@end 

Pero cuando intento agregar una animación para que, de este modo:

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

me sale el siguiente en la consola:

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

Sé que SceneKit es nuevo, pero ¿alguien sabe cómo hacerlo funcionar?

+1

Estoy realmente sorprendido de que esta es la primera ha pedido aquí sobre SceneKit pregunta alguien. –

Respuesta

0

SceneKit no admite la ruta de acceso clave a medida animatable

+0

Eso ciertamente parece plausible, pero antes de darme por vencido, me gustaría confirmar que, de hecho, lo que quiero hacer es imposible. ¿Pueden señalarme documentos o cualquier otra cosa que confirme esto? –

+0

Los documentos para SceneKit son bastante escasos. Miré y no encontré nada. El mensaje de error podría ser lo mejor que obtendrás. – jblocksom

+0

Sí, esperaba que alguien más pudiera lanzar una respuesta diferente, pero parece que esto es probablemente lo mejor que podemos imaginar, al menos hasta que Apple publique una mejor documentación. Aceptando –

3

Una solución/Hack:

  • crear un nodo de geometría menos y animar alguna propiedad animatable en ese nodo, por ejemplo, la opacidad
  • uso a SCNSceneRendererDelegate para enganchar en la etapa adecuada del proceso de renderizado y actualizar manualmente su propiedad personalizada con el valor de la propiedad animada del nodo sin geometría (asegúrese de leer la propiedad animada del nodo presentationNode)

Esta solución es feo, pero le permite sincronizar la animación de la propiedad personalizada con otras animaciones a través de SCNTransaction o CAAnimationGroup

+0

¡Una idea interesante, gracias! –

+0

Creé un "nodo de interpolación" que solo hizo esto: animé cosas como las propiedades de CIFilter y evalué los valores de presentación de cada cuadro para hacer lo que necesitaba. Funcionó bastante bien. – LucasTizma

Cuestiones relacionadas