CATransform3D – 了解变换值

下图显示了应用以下转换后的一个简单的UIView:

- (CATransform3D) transformForOpenedMenu { CATransform3D transform = CATransform3DIdentity; transform.m34 = -1.0 /450; transform = CATransform3DRotate(transform, D2R(40), 0, 1, 0); transform = CATransform3DTranslate(transform, 210, 150, -500); return transform; } 

我试图用黑色突出显示的距离具有相同的长度。 你能帮我理解价值和计算背后的逻辑吗?

干杯

UPD 9月13日

看起来像去除3DTranslate保持距离相等。 我看到我可以使用图层的框架属性重新定位到屏幕左下angular的旋转视图。 还不确定,但这可能实际上工作。

在这里输入图像说明

您正在设置的.m34值最好在包含视图的sublayerTransform上设置,而不是您正在转换的视图。

我不完全理解仿射变换后面的math,所以我做了这个项目 , 这个项目允许我用变换值来实现我想要的效果。 您可以插入上面的代码中的值,看看它的样子,但请注意,已经使用上面提到的sublayerTransform属性应用了透视图值。

对于你的具体情况,我想你想调整图层的锚点为(0.0,0.5),并只应用旋转变换。 这假设你想让菜单像门一样摆动,铰链在左边。

您看到的问题是由您的CATransform3DTranslate调用引起的。 你本质上是将Y轴设置为偏离中心,因此看到了框架的不同透视图。

这样想,

你站在一个狭长的田野中央,伸向地平线。 场的边缘看起来好像收敛到远处的某个中心点。 如果你在场地的中心,每个边缘与会聚点的angular度将是相等的。 另一方面,如果你向左或向右移动,则angular度会改变,而其中一个看起来比另一个(当然是相反的)更大。

这基本上就是你的观点所发生的事情; 当你的收敛点在右边时,将Y轴从0改变成与在上面的例子中向左或向右移动的效果相同。 你不再看中心的平行线。

所以在上面的代码中将CATransform3DTranslate中的ty设置为0应该修复您的问题IE

  transform = CATransform3DTranslate(transform, 210, 0, -500); 

您可能还需要更改tz和tx值以使其适合。

好的,所以最终解决了我的问题是:

  • 在Y轴上进行3D变换,使得视图像门transform = CATransform3DRotate(transform, D2R(40), 0, 1, 0);
  • 在图层上设置Z锚点,将其移回targetView.layer.anchorPointZ = 850;
  • 调整图层的位置,使视图位于父视图的左下angular稍微处:

    newPosition.x += 135 * positionDirection; newPosition.y += 70 * positionDirection;

这个序列在没有CATransform3DTranslate情况下调整位置,并保持“swinged”效果不失真。

谢谢大家!