Buggy CATransform3D?

时间:2015-06-01 08:43:06

标签: ios matrix identity matrix-multiplication catransform3d

EDITED

(示例包含错误,因此我将其替换为另一个)

以下代码只是一个示例:它是如何工作的:

CATransform3D temp = CATransform3DIdentity;
temp.m34 = -0.002;
temp = CATransform3DTranslate(temp, 0, -230, 0);
temp = CATransform3DRotate(temp, -M_PI / 5, 1, 0, 0);
temp = CATransform3DTranslate(temp, 0, 230, 0);

最后一行代码前的输出:

(lldb) po temp
 (m11 = 1, m12 = 0, m13 = 0, m14 = 0, m21 = 0, m22 = 0.809017002, m23 = -0.587785244, m24 = 0.00117557053, m31 = 0, m32 = 0.587785244, m33 = 0.809017002, m34 = -0.00161803409, m41 = 0, m42 = -230, m43 = 0, m44 = 1)

最后一行代码后的输出:

(lldb) po temp
 (m11 = 1, m12 = 0, m13 = 0, m14 = 0, m21 = 0, m22 = 0.809017002, m23 = -0.587785244, m24 = 0.00117557053, m31 = 0, m32 = 0.587785244, m33 = 0.809017002, m34 = -0.00161803409, m41 = 0, m42 = -43.9260902, m43 = -135.190613, m44 = 1.27038121)

什么是......?最后一行代码没有任何作用,因为它是E(它是缩进矩阵,与它相乘应该返回相同的结果)但它甚至改变了m44元素,它必须始终等于1.

即使这个矩阵执行的计算与正确的矩阵相同,例如,我也不能简单地收回存储在其中的变换值。

有人建议如何生成正确的矩阵(m44 == 1),除了手动乘法之外?

2 个答案:

答案 0 :(得分:0)

目前还不清楚你要做什么。您创建一个名为temp的CATransform3D,但在代码的第三行,您使用的是名为transform的变量,在您的3行代码中未提及。也许你的意思是使用temp代替。

答案 1 :(得分:0)

我找到了问题的原因。一切都是正确的,因为在CATransform3D中所有的变换矩阵都被转置,但我认为它们看起来像下面这样: enter image description here

所以m44 != 1因为m34不是z坐标或其他类型的翻译。它意味着“视角”,它影响m44价值。它也让我感到m44 == 1直到最后一行代码。