Core Animation - 变换<四>

上一节说了3D变换,这一节,继续来说3D变换中的几个点
1.透视投影
真实世界中,当物体远离视线时物体从视角来看变小了,但实际上他们并没有发生变化,等间距的两个物体,它们缩放的比例是一样的。这是我们所说的正常的投影。
为了达到透视的效果,我们需要手动的来修改矩阵值,Core Animation并没有提供这个函数,然而CATransform3D可以通过矩阵中一个简单的元素来控制:m34
这里写图片描述
博客中关于Core Animation的图片均来源于这本书

m34默认为0,我们通过设置m34为-1/d来应用透视效果,d代表想象中视角相机到屏幕的距离,这个位置根据像素在500-1000之间最为合适,为了显示舒服,也可根据需要自行调整,根据代码可以看出3D效果还是很明显的,效果见:https://github.com/codeliu6572/3D_m34
2.灭点
在绘图时远离物体,物体会越来越小,当远到一定程度就会消失为一点,所有的物体,他们最终消失的点都汇聚在一点,这一点被称为灭点。如图:
这里写图片描述
实际中这是视图的中心点,是所有图形变换前的anchorPoint位置,当position改变时,灭点也跟着改变,为了不改变他们的共同灭点,在做变换前需要把它们放在视图中心,然后再平移到指定位置。
3.sublayerTransform
在灭点中为了共有一个灭点,需要对所有的视图放在中心点再平移到指定位置,sublayerTransform解决这一问题,它是CATransform3D类型,影响到所有的子图层,所有的子图层都继承了这个方法,所以代码中设置这个属性就可以随便放置视图而使它们享有同一个灭点:

CATransform3D perspective = CATransform3DIdentity;
perspective.m34 = - 1.0 / 500.0;
self.containerView.layer.sublayerTransform = perspective;
//rotate layerView1 by 45 degrees along the Y axis
CATransform3D transform1 = CATransform3DMakeRotation(M_PI_4, 0, 1, 0); self.layerView1.layer.transform = transform1;
//rotate layerView2 by 45 degrees along the Y axis
CATransform3D transform2 = CATransform3DMakeRotation(-M_PI_4, 0, 1, 0); 
self.layerView2.layer.transform = transform2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值