仿射变换
CGAffineTransform transform;
transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, -50, -50); //A
transform = CGAffineTransformRotate(transform, M_PI_4); //B
transform = CGAffineTransformTranslate(transform, 50, 50); //C
变换后 transform = C×B×A×E。(A,B,C分别为CGAffineTransform变换函数构造的矩阵),这是由于CGAffineTransform变换函数构造的矩阵在左边,如:
t' = CGAffineTransformTranslate(t,tx,ty)
,结果为:t' = [ 1 0 0 1 tx ty ] * t
4步结果如下:
t = E;
t1 = A × t = A × E = A;
t2 = B × t1 = B × A;
t3 = C × t2 = C × B × A;
此时 (x', y', 1) = (x, y, 1) × t = (x, y, 1) × C × B × A;
也就是说,坐标变换是按照C->B->A的顺序变换的,和设置的顺序正好相反。
3D变换
CG的前缀告诉我们,CGAffineTransform
类型属于Core Graphics框架,Core Graphics实际上是一个严格意义上的2D绘图API,并且CGAffineTransform
仅仅对2D变换有效。
在第三章中,我们提到了zPosition
属性,可以用来让图层靠近或者远离相机(用户视角),transform
属性(CATransform3D
类型)可以真正做到这点,即让图层在3D空间内移动或者旋转。
和CGAffineTransform
类似,CATransform3D
也是一个矩阵,但是和2x3的矩阵不同,CATransform3D
是一个可以在3维空间内做变换的4x4的矩阵(图5.6)。
对一个3D像素点做CATransform3D
矩阵变换和CGAffineTransform
矩阵类似,Core Animation提供了一系列的方法用来创建和组合CATransform3D
类型的矩阵,和Core Graphics的函数类似,但是3D的平移和旋转多处了一个z
参数,并且旋转函数除了angle
之外多出了x,y,z
三个参数,分别决定了每个坐标轴方向上的旋转:
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z)
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)
你应该对X轴和Y轴比较熟悉了,分别以右和下为正方向(回忆第三章,这是iOS上的标准结构,在Mac OS,Y轴朝上为正方向),Z轴和这两个轴分别垂直,指向视角外为正方向(图5.7)。
由图所见,绕Z轴的旋转等同于之前二维空间的仿射旋转,但是绕X轴和Y轴的旋转就突破了屏幕的二维空间,并且在用户视角看来发生了倾斜。
参考资料:https://zsisme.gitbooks.io/ios-/content/chapter5/3d-transform.html