CAtransform3D transform3DFoo = CAtransform3DIDentity;transform3DFoo.m34 = -1.0 / 1000;transform3DFoo = CAtransform3DRotate(transform3DFoo,M_PI / 4,1,0);
但是,如果两条线相反:
CAtransform3D transform3DFoo = CAtransform3DIDentity;transform3DFoo = CAtransform3DRotate(transform3DFoo,0);transform3DFoo.m34 = -1.0 / 1000;
然后,视角消失了.现在它是正字法(没有透视).有熟悉透视的人知道原因吗?
更新:
// First IDentity and then transform3DFoo.m34 = -1.0 / 1000; is done1.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,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 done1.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?全部内容,希望文章能够帮你解决ios – 为什么在应用旋转变换之前需要修改CALayer的transform3D的m34?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)