3

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

随着卡片离玩家越来越远(在桌子上“向上”移动),我希望它们变得更小。我认为只需修改它们的 z 平移(或 z 比例)就可以达到预期的效果,但事实并非如此。

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

谢谢!

4

1 回答 1

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;

这里发生了什么?3D 变换矩阵是 4x4 矩阵(不是您可能期望的 3x3 矩阵)。第三行的第四列(从 1 开始计数,而不是从 0 开始)控制沿 Z 轴的透视变换。将其设置为从“相机”到 Z=0 平面(您可以将其视为屏幕)的距离的负倒数。

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

当您将距离设置为较小的值(这会使值m34变大)时,您会获得越来越强的透视投影。你会想要发挥价值来找到你喜欢的。

大多数层将其子层展平为 Z=0 平面。这意味着您应用于图层的透视投影不会应用于其子图层,并且您必须设置每个子图层的变换。

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

CATransformLayer 类参考

于 2012-12-31T19:24:30.877 回答