2010-03-06 3 views
8

Я заинтересован в использовании Core Animation для управления пользовательскими анимациями в моей OpenGL-сцене на iPhone. Я надеялся найти механизм, который позволил бы вам в общих чертах оживить путь ключа NSObject или метод делегата для каждого тика анимации. То, что я придумал, - это оживить произвольное свойство CALayer и опросить их из OpenGL, чтобы определить прогрессию анимации. Тем не менее, я убежден, что есть лучший способ сделать это. Какой самый чистый и безопасный способ использовать этот отличный движок анимации?Использование Core Animation для анимации в OpenGL

ответ

0

Если вы хотите анимировать просмотр, попробуйте прочитать iPhone UIView Animation Best Practice. Для анимации внутри OpenGL лучше использовать анимированные модели или собственный код, но не Core Animation.

+0

Что конкретно происходит при использовании Core Animation косвенно? Я знаю сильный совет против смешивания Core Animation и OpenGL на экране, но что делать, если CALayer никогда не добавляется в представление? – 2010-03-07 00:40:51

+0

Возможно, я что-то неправильно понимаю, но если вы визуализируете свою сцену с помощью OpenGL ES, вам не нужно вообще использовать Core Animation. Посмотрите на этот простой пример от Apple: http://developer.apple.com/iphone/library/samplecode/GLES2Sample/index.html У них есть UIView без CALayer. – Pavel

+1

Я говорю об использовании возможностей анимации Core Animation для анимации чего-либо в OpenGL. CALayer, который я использовал бы, не будет отображаться на экране. Вместо этого он будет анимирован, чтобы я мог посмотреть, где должна быть анимация (в соответствии с CALayer) и нарисовать объект OpenGL на экране. Таким образом, я получил бы много много бесплатно, вместо того, чтобы писать свой собственный движок анимации. – 2010-03-07 19:25:33

0

Это возможно, чтобы использовать Core Animation для вождения, что бы вы ни пожелали. Я уверен, что он может быть использован и для звука! (Учитывая небольшое подклассов CALayer). UIKit и Core Animation можно смешивать довольно свободно, с небольшой осторожностью, так как для нас также есть CAEAGLLayer.

Ключ здесь - (id) presentationLayer и - (id) modelLayer для использования pure/only OpenGL; конечно, даже иерархия может быть использована и для вашей сцены OpenGL. Но, используя CALayer для рендеринга, вы получаете еще больше «бесплатно», если это возможно для ваших обстоятельств (но также см. CATransformLayer), если это то, что вы ищете! =)

3

Я подозреваю, что вы действительно хотите только функции ослабления, используемые основной анимацией. Их достаточно легко найти с небольшим количеством поисковых запросов. Вот один пример:

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

Вы передаете в том, как далеко в вашей анимации вы (ElapsedTime/tweenDuration), и он говорит вам, что процент пути через «сроки» твин Вам необходимо быть.

1

Я пытался что-то сделать, обновляю gl-взгляд на основе его положения в своем родителе во время анимации CA. Я получал похожие результаты, прерывистая анимация, которая не синхронизировалась с анимацией CA. Я, наконец, решил прекратить использование CA и полностью использовать другой механизм интерполяции. Теперь я использую PRTween. Он работает очень хорошо. Я уверен, что есть некоторые обратные спины (ваши анимации работают в основном потоке, интерфейс не так хорош, как CA, и он немного глючит), но мои анимации работают гладко.

Смежные вопросы