5.2 3D变换.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档