2012-05-08 2 views
5

에 내가보기 내가 대신 CATransform3D 자체의 CGAffineTransform의 self.transform를 사용하여 동일한 결과를 얻을 싶습니다CATransform3D에서 CGAffineTransform

- (void)pulse { 

    CATransform3D trasform = CATransform3DScale(self.layer.transform, 1.15, 1.15, 1); 
    trasform = CATransform3DRotate(trasform, angle, 0, 0, 0); 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.toValue = [NSValue valueWithCATransform3D:trasform]; 
    animation.autoreverses = YES; 
    animation.duration = 0.3; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    animation.repeatCount = 2; 
    [self.layer addAnimation:animation forKey:@"pulseAnimation"]; 

} 

에 펄스 효과를 적용하기 위해 다음과 같은 기능을 사용하고 있습니다. layer.transform. 이것이 가능합니까?

+1

을 호기심, 이유는 것 CTransform3D를 레이어에 적용했는지 CGAffineTransform을 뷰에 적용했는지 알고 싶습니다. 이미 이전 결과에서 원하는 결과를 얻고 있다면? –

+0

self.layer.transform의 초기 값이 self.transform과 다르기 때문에 그렇습니까? – Abramodj

+0

펄스 메서드에 오기 전에 뷰에 Affine 변환을 적용했지만 레이어에 손을 대지 않았으므로 변형이 해당 ID임을 나타냅니다. – Abramodj

답변

2

물론. Xcode 문서에서 CGAffineTransform에 대한 검색을 수행하면 "CGAffineTransform Reference"라는 제목의 장이 있습니다. 이 장에는 "기능"이라는 섹션이 있습니다. 여기에는 CATransform3DScale (CGAffineTransformScale) 및 CATransform3DRotate (CGAffineTransformRotate)와 동일한 기능이 포함됩니다.

CATransform3DRotate에 대한 호출이 실제로 의미가 없습니다. 축을 중심으로 회전해야하며 모든 3 축에 0을 전달합니다. 일반적으로 CATransform3DRotate (trasform, angle, 0, 0, 1.0)를 사용하여 Z 축을 중심으로 회전합니다. 문서 인용하기 :

벡터의 길이가 0 인 경우 동작은 정의되지 않습니다.

+0

하지만 요점은 (어쩌면 내 질문에서 분명하지는 않지만) [CAMediaTimingFunction functionWithName : kCAMediaTimingFunctionEaseInEaseOut]와 동등한 방법입니다. – Abramodj

+1

당신은 정말로 분명하지 않습니다. 사실 CGAffineTransform은 뷰에 사용되고 CATransform3D는 다른 타이밍 함수를 지정하는 뷰 기반 애니메이션을 수행하는 방법을 알고 자하는 레이어에 사용됩니다. 이를 위해 animateWithDuration : delay : options : animations : completion : UIView 클래스 메서드를 사용하고 싶습니다. options 매개 변수에는 UIViewAnimationOptionCurveEaseInOut, UIViewAnimationOptionCurveLinear 등과 같은 값이 포함됩니다. 원하는 옵션을 지정한 다음 애니메이션 블록에서 변형을 변경하십시오. –

7

CATransform3DCGAffineTransform으로 변환 할 수 있지만 일부 기능이 손실됩니다. 레이어 그래픽과 그 조상을 CGAffineTransform으로 변환하면 Core Graphics로 렌더링 할 수 있다는 것을 알았습니다. 제약은 다음과 같습니다

    귀하의 입력은 XY 평면에서 평면으로 처리됩니다
  • 귀하의 출력이 너무 .m34에서
  • 관점/단축 법이
  • 중화 될 XY 평면에서 평면으로 처리됩니다

이 당신의 목적을 위해 OK 소리가 나는 경우에 :

// m13, m23, m33, m43 are not important since the destination is a flat XY plane. 
    // m31, m32 are not important since they would multiply with z = 0. 
    // m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that. 
    // m44 is implicitly 1 as CGAffineTransform's m33. 
    CATransform3D fullTransform = <your 3D transform> 
    CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42); 

요 먼저 3D 변형에서 모든 작업을하고 슈퍼 레이어를 연결하여 CATransform3DCGAffineTransform으로 변환하고 싶습니다. 레이어가 평평하고 평면 타겟 위에 렌더링된다는 점을 감안할 때, 3D 회전이 2D 가위가되어 매우 적합한 것으로 나타났습니다. 나는 또한 단축 사용을 희생하는 것이 받아 들여지고 있음을 발견했다. 아핀 변환은 평행선을 보존해야하기 때문에 그 주위에 방법이 없습니다.

코어 그래픽, 예를 들어, 당신은 변환을 연결할 수있는 사용하여 3D 변환 된 레이어를 렌더링하기 위해 (! 앵커 포인트를 존중), 그리고 마지막 어파로 변환하고, :

CGContextSaveGState(context); 
    CGContextConcatCTM(context, affine); 
    [layer renderInContext:context]; 
    CGContextRestoreGState(context); 
+0

감사합니다. 정답입니다. 불행하게도, 그것은 코코아 API에 포함되어야하는 기능 중 하나이지만 "완전한"변환 (그리고 결코 될 수없는)이 아니기 때문에가 아닙니다. – SG1

+0

나는 이것을 발견해서 너무 기쁩니다. 나는 일주일 동안 "3d to 2D Matrix"를 찾고 있었고 수학적 횡설수설을 많이 발견했습니다. – xtravar

+0

도대체 어떻게 그걸 알아 냈습니까? 이것은 대단하다! 나는 너의 수학 천재에 굴복한다. – jjxtra

관련 문제