第一部分、前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形学,矩阵中m11--m44的各个含义都不清楚,经过几天研究总结如下:(供和我一样的菜鸟学习)


iOS缩放移动 苹果的移动与缩放_CATransform3DRotate



{
CGFloat m11(x缩放), m12(y切变), m13(), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。当然,z方向上得有变化才会有透视效果);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};



iOS缩放移动 苹果的移动与缩放_CATransform3DRotate


ps:

  • 整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若m33<0,发生关于原点的对称等比变换。
  • 单设m12或m21的时候是切变效果,当【m12=角度】和【m21=-角度】的时候就是旋转效果了。两个角度值相同。
  • ()空的地方以后补充。
  • 还有,要想使用CATransform3D,必须在工程里导入QuartzCore.framework。然后在文件中

#import <QuartzCore/CATransform3D.h>。


iOS缩放移动 苹果的移动与缩放_CATransform3DRotate



iphone 透视效果(perspective)

    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = 0.0005; // 透视效果
    transform = CATransform3DRotate(transform,(M_PI/180*40), 0, 1, 0);
    [piece.layer setTransform:transform];

第二行一定要写在第三行的前面!自己理解!



iOS缩放移动 苹果的移动与缩放_CATransform3DRotate


iOS缩放移动 苹果的移动与缩放_CATransform3DRotate



第二部分

1. CATransform3D结构成员的意义。
?
structCATransform3D
{
CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(旋转), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};

ps:整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若s<0,发生关于原点的对称等比变换。

()空的地方以后补充。

2. CATransform3DMakeTranslation

CATransform3DMakeTranslation(0, 0, 0) 创建了一个4*4的单位矩阵。

3. CATransform3DMakeRotation And CATransform3DRotate

CATransform3DMakeRotation()
[objc] view plaincopy

    _transformedLayer = [CALayer layer];  
    _transformedLayer.frame = self.bounds;  
    _transformedLayer.anchorPoint = CGPointMake(0.5f, 0.5f);  
    CATransform3D sublayerTransform = CATransform3DIdentity;  
    // Set perspective  
    sublayerTransform.m34 = kPerspective;  
    [_transformedLayer setSublayerTransform:sublayerTransform];  
      
    [self.layer addSublayer:_transformedLayer];  
    //init Sublayers  
    CATransform3D t = CATransform3DMakeTranslation(0, 0, 0);  
    // take snapshot of the current view  
    [_transformedLayer addSublayer:[self snapshot:t   
                                         withView:_contentView   
                                         isMasked:YES]];  
    // 暂时先支持一个方向翻转  
    RotateDirection direction = RotateFromBottom;  
    if (YES || direction == RotateFromBottom)  
    {  
        CGFloat height = self.bounds.size.height;  
        //CGFloat cubeSize = 100.0f;  
        t = CATransform3DRotate(t, D2R(90.0), 1, 0, 0);【1】  
        t = CATransform3DTranslate(t, 0, height, 0);  
        CALayer *subLayer = [self snapshot:t withView:view isMasked:YES];  
        [_transformedLayer addSublayer:subLayer];  
    }  
    else   
    {  
    }  
      
    _newContentView = view;  
      
    [self animationCubeRotate:direction withDuration:duration];
总结:1.CATransform3DRotate和CATransform3DTranslate都是对函数参数的那个矩阵进行处理,省去了我们自己算矩阵。2.对应上一篇Core-Animation-Advanced-Techniques的其中对bounds和frame的阐述做个说明:旋转后bounds不会变,但是frame会变,有人可能用CATransform3DRotate试过后发现没变,其实变了,只是CATransform3DRotate对矩阵旋转的同时进行了缩放处理,把layer缩放到原来的frame不变又正好能显示下的大小(根据观察矩阵的m11,和m22能够看出来)