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

ios – 为什么在应用旋转变换之前需要修改CALayer的transform3D的m34?,第1张

概述以下代码可以为图层进行透视旋转变换: CATransform3D transform3DFoo = CATransform3DIdentity;transform3DFoo.m34 = -1.0 / 1000;transform3DFoo = CATransform3DRotate(transform3DFoo, M_PI / 4, 1, 0, 0); 但是,如果两条线相反: CATran 以下代码可以为图层进行透视旋转变换

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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1053300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存