2010-03-06 11 views
8

Mi interessa utilizzare Core Animation per animare animazioni personalizzate nella mia scena OpenGL su iPhone. Speravo di trovare un meccanismo che permettesse di animare genericamente un keypath di un NSObject o un metodo delegato per ogni spunta dell'animazione. Quello che mi è venuto in mente è di animare una proprietà arbitraria di un CALayer e interrogarli da OpenGL per determinare la progressione dell'animazione. Tuttavia, sono convinto che ci sia un modo migliore per farlo. Qual è il modo più pulito e sicuro per attingere a questo fantastico motore di animazione?Sfrutta l'animazione core per l'animazione in OpenGL

risposta

0

Se si desidera animare la vista, provare a leggere iPhone UIView Animation Best Practice. Per l'animazione all'interno della vista OpenGL è meglio usare modelli animati o codice personalizzato ma non Core Animation.

+0

Qual è esattamente il problema con l'uso dell'animazione core, comunque? Sono a conoscenza del forte consiglio di miscelare Core Animation e OpenGL sullo schermo, ma cosa succede se il CALayer non viene mai aggiunto a una vista? –

+0

Forse ho frainteso qualcosa, ma nel caso in cui si renderizza la scena con OpenGL ES non è necessario utilizzare Core Animation. Guarda questo semplice esempio di Apple: http://developer.apple.com/iphone/library/samplecode/GLES2Sample/index.html Hanno UIView senza alcun CALayer. – Pavel

+1

Sto parlando dell'utilizzo delle funzionalità di animazione di Core Animation per animare qualcosa in OpenGL. Il CALayer che userei non vivrebbe sullo schermo. Invece sarebbe animato in modo da poter cercare dove dovrebbe essere l'animazione (secondo il CALayer) e disegnare un oggetto OpenGL sullo schermo in relazione. In questo modo otterrei molto gratis, invece di scrivere il mio motore di animazione. –

0

È possibile utilizzare Core Animation per guidare tutto ciò che si desidera. Sono sicuro che può essere usato anche per il suono! (Data una piccola sottoclasse di CALayer). Uikit e Core Animation possono essere mescolati abbastanza liberamente, con un po 'di attenzione, dato che c'è anche CAEAGLLayer con cui giocare.

La chiave qui è - (id) presentationLayer e - (id) modelLayer per l'utilizzo di OpenGL puro/solo; ovviamente anche la gerarchia può essere utilizzata anche per la tua scena OpenGL. Ma usare CALayer per il rendering diventa ancora più "gratis", se questo è possibile per le tue circostanze (ma vedi anche CATransformLayer), se questo è ciò che cerchi! =)

3

Sospetto che ciò che si desidera veramente siano solo le funzioni di andamento utilizzate dall'animazione core. Questi sono abbastanza facili da trovare con un po 'googling. Ecco un esempio:

GLfloat bounceEaseOut(GLfloat ratio) { 
    if (ratio < 1.0f/2.75f) { 
     return 7.5625f*ratio*ratio; 
    } else if (ratio < 2.0f/2.75f) { 
     return 7.5625f*(ratio-=1.5f/2.75f)*ratio+0.75f; 
    } else if (ratio < 2.5f/2.75f) { 
     return 7.5625f*(ratio-=2.25f/2.75f)*ratio+0.9375f; 
    } else { 
     return 7.5625f*(ratio-=2.625f/2.75f)*ratio+0.984375f; 
    } 
} 

Si passa a che punto i preadolescenti sei (elapsedTime/tweenDuration) e ci dice che cosa percentuale del modo attraverso "timeline" dell'interpolazione si dovrebbe essere.

1

Stavo cercando di fare qualcosa di simile, aggiornare una vista panoramica in base alla sua posizione nel suo genitore durante un'animazione CA. Stavo ottenendo risultati simili, un'animazione incerta che non era sincronizzata con l'animazione della CA. Alla fine ho deciso di smettere di usare CA e utilizzare un motore di interpolazione diverso interamente. Ora sto usando PRTween. Funziona molto bene. Sono sicuro che ci sono alcuni svantaggi (le animazioni sono in esecuzione sul thread principale, l'interfaccia non è bella come CA, ed è un po 'buggy) ma le mie animazioni stanno andando bene.