首先,要3D效果就要实现View(layer)的透视效果(就是近大远小),是通过设置m34实现的:
m34负责z轴方向的translation,m34=-1/D,m34的默认值为0,也就意味着D为无穷大,此时投射面和坐标面平行,回到2D效果了。
D越小,透视效果越明显。
所谓的D,其实就是eye(观察点)到投射面(xy平面)的距离。
在iOS中,使用CATransform3D这个结构体来表示三维的齐次坐标变换矩阵。
iOS中的CALayer的3D本质上并不能算是真正的3D,因为视点(观察点)的位置是无法变换的,而只是3D在二维平面上的投影,投影平面就是手机屏幕,也就是xy轴组成的平面(iOS中为左手坐标系),而视点的位置是m34= -1/D中的D确定的,而layer的z轴的位置则是通过anchorPoint来指定的,所谓的(anchorPoint)锚点就是在变换中保持不变的点,也就是layer在变换中的原点,xyz三轴相交于此点。
锚点:
屏幕快照 2016-04-20 13.16.05.png为此,我写了一个简单的测试Demo:
屏幕快照 2016-04-20 14.07.40.png我设置的观察点为50,先向z轴负方向移动50,然后向沿着x轴顺时针旋转45度。
屏幕快照 2016-03-31 15.02.15.png此时的效果为:
50.0.gif如果我把观察点设置在1000,即m34 = -1/1000.f时:
1000.0.gif能够明显感觉到不同的观察点对3D效果的影响。
加油~