2010-03-06 8 views
8

Core Animation을 사용하여 iPhone의 OpenGL 장면에서 맞춤 애니메이션을 구동하는 데 관심이 있습니다. NSObject의 keypath 또는 각 애니메이션 틱에 대한 대리자 메서드를 일반적으로 애니메이션으로 만들 수있는 메커니즘을 찾고 싶습니다. 내가 생각해 낸 것은 CALayer의 임의의 속성에 애니메이션을 적용하고 애니메이션의 진행을 결정하기 위해 OpenGL에서이를 폴링하는 것입니다. 그러나, 나는 그것을 할 수있는 더 좋은 방법이 있다고 확신합니다. 이 위대한 애니메이션 엔진을 활용하는 가장 깨끗하고 안전한 방법은 무엇입니까?OpenGL의 애니메이션 용 코어 애니메이션 활용

답변

0

보기 자체에 애니메이션을 적용하려면 iPhone UIView Animation Best Practice을 사용해보십시오. OpenGL보기 내부의 애니메이션의 경우 애니메이션 모델 또는 사용자 정의 코드를 사용하는 것이 좋지만 Core Animation은 사용하지 않는 것이 좋습니다.

+0

Core Animation을 간접적으로 사용하면 어떤 문제가 발생합니까? Core Animation과 OpenGL을 화면에 섞어 놓는 것에 대한 강한 충고를 알고 있지만, CALayer가 뷰에 추가되지 않는다면 어떨까요? –

+0

어쩌면 내가 오해 할 수도 있지만, OpenGL ES로 장면을 렌더링 할 경우 Core Animation을 전혀 사용할 필요가 없습니다. 애플이 간단한 예제를 보자. http://developer.apple.com/iphone/library/samplecode/GLES2Sample/index.html 그들은 CALayer가없는 UIView를 가지고있다. – Pavel

+1

Core Animation의 애니메이션 기능을 사용하여 OpenGL에서 애니메이션을 적용하는 방법에 대해 설명합니다. CALayer를 사용하면 화면에 나타나지 않습니다. 그 대신 애니메이션이되어서 애니메이션이 어디에 있어야하는지 (CALayer에 따라) 찾아 볼 수 있고 OpenGL 오브젝트를 화면에 그려 넣을 수 있습니다. 이 방법으로 나는 내 자신의 애니메이션 엔진을 작성하는 대신 많은 것을 무료로 얻을 수 있습니다. –

0

Core Animation을 사용하여 원하는대로 움직일 수 있습니다. 나는 그것이 소리에도 사용될 수 있다고 확신한다! (CALayer의 약간의 하위 클래스가 주어짐). UIKit과 Core Animation은 약간의주의를 기울여 아주 자유롭게 혼합 될 수 있습니다. CAEAGLLayer도 같이 플레이 할 수 있습니다.

여기서 핵심은 - (id) presentationLayer 및 순수/유일한 OpenGL을 사용하는 - (id) modelLayer입니다. 물론 계층 구조조차도 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

나는 비슷한 일을하려고했는데, CA 애니메이션 중에 부모에서 그 위치를 기반으로 gl보기를 업데이트했습니다. CA 애니메이션과 동기화되지 않은 고르지 못한 애니메이션이 비슷한 결과를 얻었습니다. 마침내 CA 사용을 중단하고 다른 보간 엔진을 사용하기로 결정했습니다. 이제 PRTween을 사용 중입니다. 잘 작동하고있어. 몇 가지 단점이있는 것으로 확신합니다 (애니메이션은 기본 스레드에서 실행 중이며 인터페이스는 CA만큼 좋지 않으며 약간 버그가 있습니다).하지만 애니메이션은 매끄럽게 실행됩니다.

관련 문제