- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.2 3D变换
5.2 3D变换
3D变换
CG的前缀告诉我们,CGAffineTransform类型属于Core Graphics框架,Core
Graphics实际上是⼀个严格意义上的2D绘图API ,并且CGAffineTransform仅仅对
2D变 有效。
在第三章中,我们提到了zPosition属性,可以⽤来让图层靠近或者远离相机 (⽤
户视⾓),transform属性 (CATransform3D类型)可以真正做到这点,即让图层
在3D空间内移动或者旋转。
和CGAffineTransform类似,CATransform3D也是⼀个矩阵,但是和2x3的矩阵
不同,CATransform3D是⼀个可以在3维空间内做变 的4x4 的矩阵 (图5.6 )。
图5.7 X ,Y ,Z轴,以及围绕它们旋转的⽅向
由图所见,绕Z轴的旋转等同于之前⼆维空间的仿射旋转,但是绕X轴和Y轴的旋转就
突破了屏幕的⼆维空间,并且在⽤户视⾓看来发⽣了倾斜。
举个例⼦:清单5.4 的代码使⽤了CATransform3DMakeRotation对视图内的图层绕
Y轴做了45度⾓的旋转,我们可以把视图向右倾斜,这样会看得更清晰。
结果见图5.8 ,但并不像我们期待的那样。
清单5.4 绕Y轴旋转图层
@implementation ViewController
- (void viewDidLoad
{
[super viewDidLoad];
//rotate the layer 45 degrees along the Y axis
CATransform3D transform = CATransform3DMakeRotation(M_PI_4, 0,
self.layerView .layer.transform = transform;
}
@end
图5.9 CATransform3D的m34元素,⽤来做透视
m34的默认值是0 ,我们可以通过设置m34为- .0 / d来应⽤透视效果,d代表了想象中
视⾓相机和屏幕之间的距离,以像素为单位,那应该如何计算这个距离呢?实际上并
不需要,⼤概估算⼀个就好了。
因为视⾓相机实际上并不存在,所以可以根据屏幕上的显⽰效果⾃由决定它的防⽌的
位置。通常500- 000就已经很好了,但对于特定的图层有时候更⼩后者更⼤的值会看
起来更舒服,减少距离的值会增强透视效果,所以⼀个⾮常微⼩的值会让它看起来更
加失真,然⽽⼀个⾮常⼤的值会让它基本失去透视效果,对视图应⽤透视的代码见清
单5.5 ,结果见图5. 0 。
清单5.5 对变 应⽤透视效果
@implementation ViewController
- (void viewDidLoad
{
[super viewDidLoad];
//create a new transform
CATransform3D transform = CATransform3DIdentity;
//apply perspective
transform.m34 = - 1.0 / 500.0;
//rotate by 45 degrees along the Y axis
transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0 ;
//apply to layer
self.layerView .layer.transform = transform;
}
@end
图5. 灭点
Core Animation定义了这个点位于变 图层的anchorPoint (通常位于图层中⼼,但
也有例外,见第三章)。这就是说,当图层发⽣变 时,这个点永远位于图层变 之
前anchorPoint的位置。
当改变⼀个图层的position,你也改变了它的灭点,做3D变 的时候要时刻记住这
⼀点,当你视图通过调整m34来让它更加有3D效果,应该⾸先把它放置于屏幕中央,
然后通过平移来把它移动到指定位置 (⽽不是直接改变它的position),这样所有
的3D 图层都共享⼀个灭点。
sublayerTransform属性
如果有多个视图或者图层,每个都做3D变 ,那就需要分别设置相同的m34值,并且
确保在变 之前都在屏幕中央共享同⼀个position,如果⽤⼀个函数封装这些操作
的确会更加⽅便,但仍然有限
文档评论(0)