CATransform3D:透视变换后计算高度

5

我有一个高度为50的图层,正在围绕x轴旋转。. . 如何在旋转过程中计算高度?

CATransform3D subLayerTransform = CATransform3DMakeTranslation(0, 0, 0);
subLayerTransform.m34 = -1 / 1800; //How does height relate to perspective and angle?
subLayerTransform = CATransform3DTranslate(subLayerTransform, 0, 0, 0);
subLayerTransform = CATransform3DRotate(subLayerTransform, 45 * (M_PI / 180), 1, 0, 0);
_transitionLayer.sublayerTransform = subLayerTransform;

1
这是 sin(alpha)*length + cos(alpha)*height。 - Ramy Al Zuhouri
你能详细说明一下吗?Alpha、height和length是什么?你能把height作为方程的主题吗?如果高度为50,在没有旋转的情况下,经过45度旋转后高度是多少? - Jasper Blues
1
它是:new_height = sin(50) * _transitionLayer.bounds.size.width + cos(50) * _transitionLayer.bounds.size.height。 - Ramy Al Zuhouri
谢谢,但我仍然无法使其工作。刷新了我的公式记忆,并在下面提供了一个答案。 - Jasper Blues
1个回答

3

绕y轴旋转

  • y' = y*cos q - z*sin q
  • z' = y*sin q + z*cos q
  • x' = x

高度为y1 - y0。因此计算新的y1和y0:

CGFloat y0 = 0;
CGFloat y1 = 50;
CGFloat z = -1800; //This relates to the m34 perspective matrix.

y0 = y0 * cos(radians(45)) - z * sin(radians(45));
y1 = y1 * cos(radians(45)) - z * sin(radians(45));

CGFloat newHeight = y1 - y0;

如果 .m34 不为 0,那么新的高度实际上不是 y1 - y0,而是比 y1 - y0 稍微短一些。因为透视效果使得屏幕上显示的高度更短。 - lxmfly123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接