越野车 CATransform3D?
Buggy CATransform3D?
已编辑
(示例中有错误所以我换了一个)
以下代码只是其工作原理的示例:
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
(它是缩进矩阵,与它相乘应该 return 相同的结果)但它甚至改变了必须始终等于 1 的 m44 元素。
即使这个矩阵执行与正确矩阵相同的计算,例如,我也不能简单地取回存储在其中的变换值。
除了手动相乘之外,有人可以提出如何生成正确矩阵 (m44 == 1) 的解决方案吗?
不清楚您要做什么。您创建了一个名为 temp 的 CATransform3D
,但在代码的第三行中,您使用了一个名为 transform
的变量,该变量在您的 3 行代码的其他地方未提及。也许您打算改用 temp
。
我找到问题的原因了。一切都是正确的,因为在 CATransform3D
中所有的变换矩阵都被转置了,但我认为它们看起来像下面这样:
所以 m44 != 1
因为 m34 不是 z
坐标或另一种翻译。这意味着 "perspective" 影响 m44
值。还纠结到最后一行代码m44 == 1
已编辑
(示例中有错误所以我换了一个)
以下代码只是其工作原理的示例:
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
(它是缩进矩阵,与它相乘应该 return 相同的结果)但它甚至改变了必须始终等于 1 的 m44 元素。
即使这个矩阵执行与正确矩阵相同的计算,例如,我也不能简单地取回存储在其中的变换值。
除了手动相乘之外,有人可以提出如何生成正确矩阵 (m44 == 1) 的解决方案吗?
不清楚您要做什么。您创建了一个名为 temp 的 CATransform3D
,但在代码的第三行中,您使用了一个名为 transform
的变量,该变量在您的 3 行代码的其他地方未提及。也许您打算改用 temp
。
我找到问题的原因了。一切都是正确的,因为在 CATransform3D
中所有的变换矩阵都被转置了,但我认为它们看起来像下面这样:
所以 m44 != 1
因为 m34 不是 z
坐标或另一种翻译。这意味着 "perspective" 影响 m44
值。还纠结到最后一行代码m44 == 1