2016-07-13 4 views
1

번역하고 동시에 회전하려는 CALayer가 있습니다. 내가 실제로 작동 할 수있는 다음과 같은 코드가 있습니다CATransform3D를 사용하여 CALayer를 회전하고 변환하는 올바른 순서는 무엇입니까

// layer 1: 
    // translate: (△x, △y, △z) = (length/2, 0, length/2) 
    // rotate around y: 90 degree 
    CATransform3D transformLayer1 = CATransform3DIdentity; 
    transformLayer1 = CATransform3DTranslate(transformLayer1, length/2, 0, length/2 ); 
    transformLayer1 = CATransform3DRotate(transformLayer1, M_PI_2, 0, 1, 0); 
    self.layer1.transform = transformLayer1; 

을 내 테스트 동안을, 나는 예를 들어, 코드는 다음과 같이 변경, 번역 및 회전의 순서를 변경하면 변형 결과가 다를 수 찾기 :

디버깅에서
CATransform3D transformLayer1 = CATransform3DIdentity; 

    // do rotation firstly, and then translation 
    transformLayer1 = CATransform3DRotate(transformLayer1, M_PI_2, 0, 1, 0); 
    transformLayer1 = CATransform3DTranslate(transformLayer1, length/2, 0, length/2 ); 

    self.layer1.transform = transformLayer1; 

enter image description here

, I는 각 단계에서의 변환 행렬의 값을 출력한다. 결과는 m43의 값이 다른 것을 보여줍니다. 왜 이런 일이 일어 났는지 설명 할 수있는 사람이 있습니까? 또는 CATransform3DTranslate() 및 CATransform3DRotate()의 Core Animation 기능을 이해하는 방법은 무엇입니까?

답변

0

적절한 순서는 원하는 항목에 따라 다르지만 행렬 곱셈은 not commutative입니다. 즉 A와 B는 = B * A이고 A와 B는 행렬입니다.

그러나 코드의 측면에서 올바르게 기억한다면 가장 먼저 적용해야하는 행렬이 오른쪽에 있어야한다고 생각합니다. 따라서 ROT 및 TRANS 행렬이 있고 회전을 원한다면 변환을 수행하십시오. TRANS * ROT (행렬을 가지고 마지막으로 한 것은 지난 시간 이었기 때문에, 나는 거꾸로 돌아갔다.)

concat function을 사용하면 마지막 행렬을 기반으로 다음 행렬을 생성하는 대신에 multipilcation을 수행 할 수있다. 그 쉽게 대답에 대한

+0

감사를 (아마도 빠른이 작업을 수행하지만 확실하지 메신저하는 * 연산자를 오버로드 할만큼 똑똑) 뭐죠 좌우 곱의 측면에서 계속 볼 수 있습니다. I는 함수 회전 (각도, X, Y, Z) * ​​t 매트릭스 승산에 기초를 리턴하는 진짜임을 나타내는 것, 헤더 파일 CATransform3DRotate의 의견을 조사했다. 나는 이것을 aswer로 표시 할 것이다 :) –