以下代码可以对图层进行透视图旋转变换:
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,因此首先投影不会做任何事情。
要了解为什么会这样,您需要对转换矩阵的工作原理有所了解。
我相信,通过执行以下操作,可以通过转换矩阵M
对CA中的位置进行转换:
[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
是一件无稽之谈-正确的事情是乘以一个投影矩阵。无论如何,如果将所有内容放在一起,您应该就能明白为什么我在第一段中所说的是正确的(假设我没有犯任何错误:)