2012-07-31 19 views
10

Wiem, że można utworzyć custom animatable properties in Core Animation, ale co z systemem SceneKit w OS X 10.8? Wydaje się, że SCNAnimatable nie ujawnia tych samych interfejsów API, co CALayer w przypadku tworzenia animacji właściwości.Własne właściwości animacyjne w programie SceneKit

W mojej aplikacji, mam podklasę SCNNode o nazwie Starfield, którą przeportowałem ze starej aplikacji OpenGL przy użyciu SCNNodeRendererDelegate. Starfields narazić właściwość GLfloat nazywa warpFactor:

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

@property(nonatomic) GLfloat warpFactor; 
@end 

Ale gdy próbuję dodać animację do niego tak:

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

otrzymuję następujący w konsoli:

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

Wiem, że SceneKit jest zupełnie nowy, ale czy ktoś wie, jak to zrobić?

+1

Jestem autentycznie zaskoczony, że to jest pierwsze pytanie, ktoś poprosił o SceneKit tutaj. –

Odpowiedz

0

SceneKit nie obsługuje niestandardowych animatable keypath

+0

To na pewno wydaje się prawdopodobne, ale zanim się poddam, chciałbym potwierdzić, że to, co chcę zrobić, jest niemożliwe. Czy możesz wskazać mi dokumenty, czy cokolwiek innego, które to potwierdza? –

+0

Dokumenty programu SceneKit są dość nieliczne. Spojrzałem i nic nie znalazłem. Komunikat o błędzie może być najlepszy, jaki dostaniesz. – jblocksom

+0

Tak, miałem nadzieję, że ktoś inny będzie mógł wskoczyć z inną odpowiedzią, ale wygląda na to, że jest to najlepsze, co możemy sobie wyobrazić, dopóki Apple nie wyda lepszej dokumentacji. Akceptacja. –

3

Rozwiązaniem/Hack:

  • utworzyć węzeł geometrii mniej pewne i animowanie właściwości animatable na tym węźle, na przykład krycie
  • korzystania a SCNSceneRendererDelegate, aby podłączyć się do odpowiedniego etapu procesu renderowania i ręcznie zaktualizować właściwość niestandardową o wartość animowanej właściwości węzła mniejszej geometrii (pamiętaj, aby przeczytać animowaną właściwość z węzła presentationNode)

To rozwiązanie jest brzydki, ale pozwala na zsynchronizowanie animacji właściwości niestandardowej z innymi animacji poprzez SCNTransaction lub CAAnimationGroup

+0

Interesujący pomysł, dzięki! –

+0

Stworzyłem "węzeł interpolacji", który właśnie to zrobił: animowałem takie rzeczy jak właściwości CIFilter i oceniałem wartości prezentacji każdej klatki, aby zrobić to, czego potrzebowałem. To działało całkiem dobrze. – LucasTizma