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

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是一件无稽之谈-正确的事情是乘以一个投影矩阵。

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

07-28 04:06