美文网首页
IOS 仿射变换和3D变换

IOS 仿射变换和3D变换

作者: whlpkk | 来源:发表于2017-04-28 19:58 被阅读69次

仿射变换

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)。

图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)。

图5.7 X,Y,Z轴,以及围绕它们旋转的方向

由图所见,绕Z轴的旋转等同于之前二维空间的仿射旋转,但是绕X轴和Y轴的旋转就突破了屏幕的二维空间,并且在用户视角看来发生了倾斜。

参考资料:https://zsisme.gitbooks.io/ios-/content/chapter5/3d-transform.html

相关文章

网友评论

      本文标题:IOS 仿射变换和3D变换

      本文链接:https://www.haomeiwen.com/subject/wcyazttx.html