2010-03-06 19 views
8

Estoy interesado en usar Core Animation para conducir animaciones personalizadas en mi escena OpenGL en el iPhone. Esperaba encontrar un mecanismo que te permitiera animar genéricamente un keypath de un NSObject o un método de delegado para cada tic de animación. Lo que se me ocurrió es animar una propiedad arbitraria de un CALayer y sondearlos desde OpenGL para determinar la progresión de la animación. Sin embargo, estoy convencido de que hay una mejor manera de hacerlo. ¿Cuál es la forma más limpia y segura de aprovechar este gran motor de animación?Aprovechamiento de la animación principal para la animación en OpenGL

Respuesta

0

Si desea animar la vista, intente leer iPhone UIView Animation Best Practice. Para la animación dentro de la vista OpenGL, es mejor usar modelos animados o código personalizado pero no Core Animation.

+0

¿Cuál es el problema con el uso de Core Animation indirectamente? Soy consciente del fuerte consejo de no mezclar Core Animation y OpenGL ON the screen, pero ¿y si el CALayer nunca se agrega a una vista? –

+0

Quizás malinterprete algo, pero en caso de que represente su escena con OpenGL ES, no es necesario utilizar Core Animation en absoluto. Mire este ejemplo simple de Apple: http://developer.apple.com/iphone/library/samplecode/GLES2Sample/index.html Tienen UIView sin ningún CALayer. – Pavel

+1

Estoy hablando de usar las capacidades de animación de Core Animation para animar algo en OpenGL. El CALayer que usaría no viviría en la pantalla. En cambio, estaría animado para que yo pudiera ver dónde se supone que está la animación (según el CALayer) y dibujar un objeto OpenGL en la pantalla en relación. De esta manera obtendría mucho gratis, en lugar de escribir mi propio motor de animación. –

0

Esto es posible, para usar Core Animation para conducir lo que desee. ¡Estoy seguro de que también se puede usar para sonido! (Dada una pequeña subclasificación de CALayer). UIKit y Core Animation se pueden mezclar con bastante libertad, con un poco de cuidado, ya que también hay CAEAGLLayer con el que podemos jugar.

La clave aquí es - (id) presentationLayer y - (id) modelLayer para usar pure/solo OpenGL; por supuesto, incluso la jerarquía también se puede usar para su escena OpenGL. Pero, al usar CALayer para renderizar también se obtiene aún más "gratis", si esto es posible para sus circunstancias (pero también vea CATransformLayer), ¡si esto es lo que busca! =)

3

Sospecho que lo que realmente desea son solo las funciones de relajación utilizadas por la animación central. Estos son fáciles de encontrar con un poco de google. He aquí un ejemplo:

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; 
    } 
} 

se pasa en qué punto en que sus hijos preadolescentes que son (elapsedTime/tweenDuration) y te dice qué porcentaje de la manera a través de "línea de tiempo" de la interpolación que debería ser.

1

Estaba tratando de hacer algo similar, actualizar una vista gl en función de su posición en su matriz durante una animación de CA. Estaba obteniendo resultados similares, animación entrecortada que no estaba sincronizada con la animación CA. Finalmente decidí dejar de usar CA y usar un motor de interpolación diferente por completo. Ahora estoy usando PRTween. Está funcionando muy bien. Estoy seguro de que hay algunas desventajas (sus animaciones se ejecutan en el hilo principal, la interfaz no es tan buena como CA, y es un poco problemático) pero mis animaciones se ejecutan sin problemas.

Cuestiones relacionadas