gpt4 book ai didi

ios - 为什么一个CALayer的transform3D的m34需要在应用旋转变换之前修改?

转载 作者:可可西里 更新时间:2023-11-01 05:38:06 25 4
gpt4 key购买 nike

以下代码可以对图层进行透视旋转变换:

CATransform3D transform3DFoo = CATransform3DIdentity;

transform3DFoo.m34 = -1.0 / 1000;

transform3DFoo = CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

但是,如果两条线颠倒:

CATransform3D transform3DFoo = CATransform3DIdentity;

transform3DFoo = CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

transform3DFoo.m34 = -1.0 / 1000;

然后透视就没了。现在它是正交的(没有透视)。熟悉透视的人知道这是为什么吗?


更新:

// First Identity and then transform3DFoo.m34 = -1.0 / 1000; is done

1.00000 0.00000 0.00000 0.00000
0.00000 1.00000 0.00000 0.00000
0.00000 0.00000 1.00000 -0.00100
0.00000 0.00000 0.00000 1.00000

// and then CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0);

1.00000 0.00000 0.00000 0.00000
0.00000 0.70711 0.70711 -0.00071
0.00000 -0.70711 0.70711 -0.00071
0.00000 0.00000 0.00000 1.00000

// Now start with Identity and only the Rotate statement is done:

1.00000 0.00000 0.00000 0.00000
0.00000 0.70711 0.70711 0.00000
0.00000 -0.70711 0.70711 0.00000
0.00000 0.00000 0.00000 1.00000

// and then transform3DFoo.m34 = -1.0 / 1000; is done

1.00000 0.00000 0.00000 0.00000
0.00000 0.70711 0.70711 0.00000
0.00000 -0.70711 0.70711 -0.00100
0.00000 0.00000 0.00000 1.00000

(加上“OpenGL”的标签是因为OpenGL的原理大概是一样的)

最佳答案

先设置m34相当于先旋转再投影。最后设置m34 大致相当于先投影再旋转。由于输入坐标的 z=0,首先投影不会做任何事情。

要了解这是为什么,您需要稍微了解一下变换矩阵的工作原理。

我相信在 CA 中,位置由变换矩阵 M 进行变换,方法是:

[x y z w] = [x y z w] * M

(参见 http://en.wikipedia.org/wiki/Matrix_multiplication)

将两个变换矩阵相乘等同于串联变换。左边的变换/矩阵首先发生。很容易看出这是为什么:

[x y z w] * (LEFT * RIGHT) = ([x y z w] * LEFT) * RIGHT

大多数(全部?)CA 变换函数(例如 CATransform3DRotate)只是将您的变换矩阵与另一个适当构造的矩阵预乘,例如:

M = ROTATE * M

设置m34大致相当于预乘一个投影矩阵,即:

M = PROJ * M

(其中 PROJ 是投影矩阵——单位矩阵,但设置了 m34)

这不完全正确(这就是我一直粗略地说的原因)——只有当 M 在正确的位置有一些 0 和 1 时它才有效。基本上,在一般情况下,仅设置 m34 是无稽之谈——正确的做法是乘以投影矩阵。

无论如何,如果将所有这些放在一起,您应该能够明白为什么我在第一段中所说的是正确的(假设我没有犯任何错误:)

关于ios - 为什么一个CALayer的transform3D的m34需要在应用旋转变换之前修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com