核心动画:沿着平面移动图层

Rob*_*eph 3 3d core-animation calayer perspective ios

我正在开发一种纸牌游戏,其中显示的卡片位于带有透视的桌子上.桌子和牌都有相同的x旋转(45°).

随着牌越来越远离玩家(在桌子上"向上移动")我希望它们变得更小.我认为简单地修改它们的z平移(或z标度)我可以完成所需的效果,但事实并非如此.

我是否必须同时移动缩放它,或者有没有办法改变z深度并让Core Animation为我处理一切?

谢谢!

rob*_*off 8

除了在" 核心动画编程指南 "中的"修改转换数据结构"下的示例中,这是没有直接记录的内容:

清单2中的示例说明了如何将a配置CATransform3D为透视变换.

清单2 直接修改CATransform3D数据结构

 CATransform3D aTransform = CATransform3DIdentity;
// the value of zDistance affects the sharpness of the transform.
zDistance = 850;
aTransform.m34 = 1.0 / -zDistance;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?3D变换矩阵是4x4矩阵(不是您所期望的3x3矩阵).第三行的第四列(从一个计数,而不是零)控制沿Z轴的透视变换.将其设置为从"摄像机"到Z = 0平面(您可以将其视为屏幕)的距离的负倒数.

默认情况下,m34为零,这意味着从相机到屏幕的距离是无穷大.在无穷远处,每个(有限)点与相机等距离,因此没有视角.这被称为"正交投影".

当您将距离设置为较小的值(m34更大)时,您可以获得越来越强大的透视投影.您将希望使用该值来找到您喜欢的值.

大多数层将其子层压平到Z = 0平面.这意味着您应用于图层的透视投影将不适用于其子图层,您必须设置每个子图层的变换.

如果您不需要用户能够点击特定卡片,则应将卡片层添加为a的子图层CATransformLayer.A CATransformLayer 不会将其子图层展平为Z = 0平面,因此您可以将透视投影变换应用于CATransformLayer,而您不必担心将其应用于单个卡层.但是,a CATransformLayer不支持hitTest:,因此您无法轻易确定触摸事件触摸了哪些卡.

CATransformLayer类参考