Rob*_*eph 3 3d core-animation calayer perspective ios
我正在开发一种纸牌游戏,其中显示的卡片位于带有透视的桌子上.桌子和牌都有相同的x旋转(45°).
随着牌越来越远离玩家(在桌子上"向上移动")我希望它们变得更小.我认为简单地修改它们的z平移(或z标度)我可以完成所需的效果,但事实并非如此.
我是否必须同时移动和缩放它,或者有没有办法改变z深度并让Core Animation为我处理一切?
谢谢!
除了在" 核心动画编程指南 "中的"修改转换数据结构"下的示例中,这是没有直接记录的内容:
清单2中的示例说明了如何将a配置
CATransform3D为透视变换.清单2 直接修改CATransform3D数据结构
Run Code Online (Sandbox Code Playgroud)CATransform3D aTransform = CATransform3DIdentity; // the value of zDistance affects the sharpness of the transform. zDistance = 850; aTransform.m34 = 1.0 / -zDistance;
这里发生了什么?3D变换矩阵是4x4矩阵(不是您所期望的3x3矩阵).第三行的第四列(从一个计数,而不是零)控制沿Z轴的透视变换.将其设置为从"摄像机"到Z = 0平面(您可以将其视为屏幕)的距离的负倒数.
默认情况下,m34为零,这意味着从相机到屏幕的距离是无穷大.在无穷远处,每个(有限)点与相机等距离,因此没有视角.这被称为"正交投影".
当您将距离设置为较小的值(m34更大)时,您可以获得越来越强大的透视投影.您将希望使用该值来找到您喜欢的值.
大多数层将其子层压平到Z = 0平面.这意味着您应用于图层的透视投影将不适用于其子图层,您必须设置每个子图层的变换.
如果您不需要用户能够点击特定卡片,则应将卡片层添加为a的子图层CATransformLayer.A CATransformLayer 不会将其子图层展平为Z = 0平面,因此您可以将透视投影变换应用于CATransformLayer,而您不必担心将其应用于单个卡层.但是,a CATransformLayer不支持hitTest:,因此您无法轻易确定触摸事件触摸了哪些卡.
| 归档时间: |
|
| 查看次数: |
674 次 |
| 最近记录: |