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

时间:2012-12-31 18:51:27

标签: ios 3d core-animation calayer perspective

我正在制作纸牌游戏,其中卡片显示在有透视的桌子上。桌子和牌都有相同的x旋转(45°)。

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

我是否必须同时移动缩放它,或者是否有办法更改z深度并让Core Animation为我处理所有内容?

谢谢!

1 个答案:

答案 0 :(得分:8)

这是没有直接记录的内容,除了“Modifying the Transform Data Structure” in the Core Animation Programming Guide下的示例:

  

清单2中的示例说明了如何将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矩阵)。第三行的第四列(从一个计数,而不是零)控制沿Z轴的透视变换。将其设置为从“摄像机”到Z = 0平面(您可以将其视为屏幕)的距离的负倒数。

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

当您将距离设置为较小的值(使m34更大)时,您会获得越来越强大的透视投影。您需要使用该值来找到您喜欢的值。

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

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

CATransformLayer Class Reference