我正在制作纸牌游戏,其中卡片显示在有透视的桌子上。桌子和牌都有相同的x旋转(45°)。
随着牌越来越远离玩家(在桌子上“向上移动”)我希望它们变小。我认为只需修改它们的z平移(或z标度)我就可以达到预期的效果,但事实并非如此。
我是否必须同时移动和缩放它,或者是否有办法更改z深度并让Core Animation为我处理所有内容?
谢谢!
答案 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:
,因此您无法轻易确定触摸事件触及哪些卡片。