2012-12-31 1 views
3

나는 원근감이있는 테이블에 카드가 놓여있는 카드 게임을하고 있습니다. 테이블과 카드는 모두 동일한 x 회전 (45 °)을 사용합니다.코어 애니메이션 : 평면을 따라 레이어 이동

카드가 플레이어에서 멀어 질수록 (테이블에서 위로 움직임) 나는 카드가 작아지기를 바랍니다. 나는 단순히 z 번역 (또는 z 축척)을 수정하면 원하는 효과를 얻을 수 있다고 생각했지만 그렇지 않습니다.

을 동시에 이동해야합니까, 아니면 z 깊이를 변경하고 Core Animation에서 모든 것을 처리하도록 할 수 있습니까?

감사합니다.

답변

8

“Modifying the Transform Data Structure” in the Core Animation Programming Guide 아래의 예를 제외하고 직접 설명하지 뭔가입니다 : Listing 2의

예는 관점으로 CATransform3D 변환을 구성하는 방법을 보여줍니다.

목록 2 CATransform3D 데이터 구조를 수정

직접

CATransform3D aTransform = CATransform3DIdentity; 
// the value of zDistance affects the sharpness of the transform. 
zDistance = 850; 
aTransform.m34 = 1.0/-zDistance; 

여기 무슨 일이야? 3D 변환 매트릭스는 4x4 매트릭스입니다 (3x3 매트릭스는 아닙니다). 세 번째 행의 네 번째 열 (1이 아닌 0부터 계산)은 Z 축을 따라 투시 변환을 제어합니다. "카메라"에서 Z = 0 평면 (화면이라고 생각할 수 있음)까지의 거리의 음의 역수로 설정합니다.

기본적으로 m34은 0이며 카메라에서 화면까지의 거리가 무한대임을 나타냅니다. 무한대에서 모든 (유한) 점은 카메라에서 등거리이므로 아무런 시야가 없습니다. 이를 "직교 투영"이라고합니다.

거리를 더 작은 값 (m34이 더 큼)으로 설정하면 점점 더 원근 투영이 높아집니다. 당신은 가치있는 것을 가지고 놀기를 원할 것입니다.

대부분의 레이어는 하위 레이어를 Z = 0 평면으로 평탄화합니다. 즉, 레이어에 적용한 투시 투영법은 하위 레이어에 적용되지 않으며 모든 하위 레이어의 변형을 설정해야합니다.

사용자가 특정 카드를 탭할 필요가없는 경우 카드 레이어를 CATransformLayer의 하위 레이어로 추가해야합니다. CATransformLayer이 하위 레이어를 Z = 0 평면에 배치하지 않으므로 원근 투영 변환을 CATransformLayer에만 적용 할 수 있으므로 개별 카드 레이어에 적용하는 것에 대해 걱정할 필요가 없습니다. 그러나 CATransformLayerhitTest:을 지원하지 않으므로 터치 이벤트로 어떤 카드를 터치했는지 쉽게 판단 할 수 없습니다.

CATransformLayer Class Reference

+0

대단히 감사합니다. – RobertJoseph

+0

많은 질문에 대한 좋은 답변입니다. – nielsbot

+0

글쎄 답변. 매우 명확하고 요점. (투표를했습니다.) 나는이 자료를 알아 내려고 할 때이 게시물을 다시 읽으시기 바랍니다. 그 대신에 나는 며칠 동안 주위를 날랐다. –

관련 문제