2012-07-31 16 views
10

Ich weiß, dass es möglich ist, custom animatable properties in Core Animation zu erstellen, aber was ist mit dem SceneKit-Framework von OS X 10.8? SCNAnimatable scheint nicht die gleichen APIs verfügbar zu machen, die CALayer für das Animieren von Eigenschaften ermöglicht. In meiner Anwendung habe ich eine SCNNode Unterklasse namens Starfield, die ich von einer alten OpenGL-Anwendung mit einem SCNNodeRendererDelegate portiert habe Starfields aussetzen eine GLfloat Eigenschaft warpFactor genannt:Benutzerdefinierte animierbare Eigenschaften in SceneKit

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

@property(nonatomic) GLfloat warpFactor; 
@end 

Aber wenn ich versuche, eine Animation, um es hinzuzufügen, etwa so:

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

ich folgend in der Konsole:

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

Ich weiß, SceneKit ist brandneu, aber weiß irgendjemand, wie das funktioniert?

+1

Ich bin wirklich überrascht, zu synchronisieren, dass dies die erste Frage, hat jemand hier über SceneKit gefragt. –

Antwort

0

SceneKit nicht unterstützt benutzerdefinierte animierbaren Schlüsselpfad

+0

Das erscheint sicherlich plausibel, aber bevor ich einfach aufgäbe, würde ich gerne bestätigen, dass in der Tat das, was ich tun möchte, unmöglich ist. Kannst du mich auf Dokumente oder irgendetwas anderes hinweisen, das dies bestätigt? –

+0

Die Dokumentation für SceneKit ist ziemlich spärlich. Ich schaute und fand nichts. Die Fehlermeldung ist möglicherweise die beste, die Sie erhalten. – jblocksom

+0

Ja, ich hatte gehofft, dass jemand anderes mit einer anderen Antwort einspringen könnte, aber es sieht so aus, als ob das wahrscheinlich das Beste ist, was wir uns vorstellen können, bis Apple eine bessere Dokumentation veröffentlicht. Akzeptieren. –

3

Eine Abhilfe/Hack:

  • einen geometrie weniger Knoten erstellen und einig animierbaren Eigenschaft auf diesem Knoten animieren, zum Beispiel der Opazität
  • Verwendung a SCNSceneRendererDelegate, um in die entsprechende Phase des Renderprozesses einzufügen und Ihre benutzerdefinierte Eigenschaft manuell mit dem Wert der animierten Eigenschaft des geometriefreien Knotens zu aktualisieren (achten Sie darauf, die animierte Eigenschaft aus dem Knoten presentationNode zu lesen)

Diese Lösung ist hässlich, aber es ermöglicht es Ihnen, die Animation der benutzerdefinierten Eigenschaft mit anderen Animationen über SCNTransaction oder CAAnimationGroup

+0

Interessante Idee, danke! –

+0

Ich habe einen "Interpolation Node" erstellt, der genau das getan hat: Ich animierte Dinge wie CIFilter-Eigenschaften und bewertete die Darstellungswerte in jedem Frame, um das zu tun, was ich brauchte. Es hat ziemlich gut funktioniert. – LucasTizma