5.2.2.1、透视投影介绍
在真实世界中,东西离我们越远看起来就越小
在等距投影中,远处的物体和近处的物体保持同样的缩放比例
为了做一些修正,我们需要引入投影变换(又称作z变换)来对除了旋转之外的变换矩阵做一些修改,Core Animation并没有给我们提供设置透视变换的函数,因此我们需要手动修改矩阵值。
CATransform3D的透视效果通过矩阵中m34的值来控制。
m34用于按比例缩放X和Y的值来计算到底要离视角多远。
m34的默认值是0,我们可以通过设置m34为(-1.0 / d)来应用透视效果,d代表了视角相机和屏幕之间的距离,以像素为单位,那应该如何计算这个距离呢?大概估算一个就行了。
因为视角相机实际上并不存在,所以可以根据屏幕上的显示效果自由决定它放置的位置。通常500-1000就已经很好了,但对于特定的图层有时候更小后者更大的值会看起来更舒服,减少距离的值会增强透视效果,所以一个非常微小的值会让它看起来更加失真,然而一个非常大的值会让它基本失去透视效果。
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];// 创建一个新的transform
CATransform3D transform = CATransform3DIdentity;// 应用透视
transform.m34 = - 1.0 / 500.0;// 绕Y轴旋转45度
transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);// 应用到图层上self.layerView.layer.transform = transform;
}
@end
5.2.2.2、消亡点
当在透视角度绘图的时候,远离相机视角的物体将会变小变远,当远离到一个极限距离,它们可能就缩成了一个点,于是所有的物体最后都汇聚消失在同一个点。
在现实中,这个点通常是视图的中心,于是为了在应用中创建拟真效果的透视,这个店应该聚在屏幕中点,或者至少是包含所有3D对象的视图中点。
Core Animation定义了这个点位于变换图层的anchorPoint。这就是说,当图层发生变换时,这个点永远位于图层变换之前anchorPoint的位置。
当改变一个图层的position,你也改变了它的消亡点,做3D变换的时候要时刻记住,当你视图通过调整m34来让它更加有3D效果,应该首先把它放置于屏幕中央,然后通过平移来把它移动到指定位置(而不是直接改变它的position),这样所有的3D图层都共享一个消亡点。