Я заинтересован в использовании Core Animation для управления пользовательской анимацией в моей сцене OpenGL на iPhone. Я надеялся найти механизм, который позволил бы вам в общем случае анимировать ключевой путь объекта NSObject или метода делегата для каждого тика анимации. Я придумал анимировать произвольное свойство CALayer и опрашивать их из OpenGL, чтобы определить ход анимации. Однако я убежден, что есть способ лучше. Каков самый чистый и безопасный способ задействовать этот замечательный движок анимации?
Использование базовой анимации для анимации в OpenGL
Ответы (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), и он сообщает вам, какой процент пути по «временной шкале» подростка вы должны пройти.
Я пытался сделать что-то подобное, обновить представление gl в зависимости от его положения в родительском элементе во время анимации CA. Я получал аналогичные результаты, прерывистая анимация, которая не синхронизировалась с анимацией CA. В конце концов я решил прекратить использование CA и полностью использовать другой механизм интерполяции. Теперь я использую PRTween. Работает очень хорошо. Я уверен, что есть некоторые недостатки (ваши анимации выполняются в основном потоке, интерфейс не так хорош, как CA, и он немного глючит), но мои анимации работают плавно.
Это возможно, использовать Core Animation для управления чем угодно. Я уверен, что его тоже можно использовать для звука! (Учитывая небольшой подкласс CALayer). UIKit и Core Animation можно смешивать довольно свободно, с небольшой осторожностью, поскольку есть CAEAGLLayer, с которым мы можем поиграть.
Ключевыми здесь являются - (id) presentationLayer и - (id) modelLayer для использования чистого / только OpenGL; конечно, даже иерархия может быть использована для вашей сцены OpenGL. Но использование CALayer для рендеринга также дает еще больше «бесплатно», если это возможно в ваших обстоятельствах (но также см. CATransformLayer), если это то, что вы ищете! знак равно