我正在开发一种纸牌游戏,其中纸牌以透视的形式显示在桌子上。桌子和卡片都具有相同的 x 旋转 (45°)。
随着卡片离玩家越来越远(在桌子上“向上”移动),我希望它们变得更小。我认为只需修改它们的 z 平移(或 z 比例)就可以达到预期的效果,但事实并非如此。
我是否必须同时移动和缩放它,或者有没有办法改变 z 深度并让 Core Animation 为我处理一切?
谢谢!
我正在开发一种纸牌游戏,其中纸牌以透视的形式显示在桌子上。桌子和卡片都具有相同的 x 旋转 (45°)。
随着卡片离玩家越来越远(在桌子上“向上”移动),我希望它们变得更小。我认为只需修改它们的 z 平移(或 z 比例)就可以达到预期的效果,但事实并非如此。
我是否必须同时移动和缩放它,或者有没有办法改变 z 深度并让 Core Animation 为我处理一切?
谢谢!
这是没有直接记录的内容,除了核心动画编程指南中“修改转换数据结构”下的示例:
清单 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;
这里发生了什么?3D 变换矩阵是 4x4 矩阵(不是您可能期望的 3x3 矩阵)。第三行的第四列(从 1 开始计数,而不是从 0 开始)控制沿 Z 轴的透视变换。将其设置为从“相机”到 Z=0 平面(您可以将其视为屏幕)的距离的负倒数。
默认情况下,m34
为零,这意味着从相机到屏幕的距离是无穷大。在无穷远处,每个(有限)点都与相机等距,因此没有透视。这称为“正交投影”。
当您将距离设置为较小的值(这会使值m34
变大)时,您会获得越来越强的透视投影。你会想要发挥价值来找到你喜欢的。
大多数层将其子层展平为 Z=0 平面。这意味着您应用于图层的透视投影不会应用于其子图层,并且您必须设置每个子图层的变换。
如果您不需要用户能够点击特定卡片,则应将卡片图层添加为CATransformLayer
. ACATransformLayer
不会将其子层展平到 Z=0 平面中,因此您可以将透视投影变换仅应用于CATransformLayer
,而不必担心将其应用于各个卡片层。但是, aCATransformLayer
不支持hitTest:
,因此您无法轻松确定触摸事件触摸了哪些卡片。