【问题标题】:Buggy CATransform3D?越野车 CATransform3D?
【发布时间】:2015-06-01 08:43:05
【问题描述】:

已编辑

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

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

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(它是缩进矩阵,与它相乘应该返回相同的结果)但它甚至改变了必须始终等于 1 的 m44 元素。

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

除了手动相乘之外,任何人都可以提出如何生成正确矩阵 (m44 == 1) 的解决方案吗?

【问题讨论】:

  • 这里有点难说,你介意展示你的真实代码吗?
  • 有什么特别不懂的? A -> A' 其中A' 可靠地具有m44 == 1 使用Objective-C 功能?另一段文字描述了一个具体的例子和意想不到的结果。
  • 已编辑:修正了一个错误。

标签: ios matrix identity matrix-multiplication catransform3d


【解决方案1】:

目前尚不清楚您要做什么。您创建了一个名为 temp 的 CATransform3D,但在代码的第三行,您使用了一个名为 transform 的变量,这在您的 3 行代码的其他地方没有提到。也许您打算改用temp。

【讨论】:

  • 是的,你是对的。它应该是temp 而不是transform,这个例子甚至应该可以工作,所以我需要发布另一个例子。无论如何,当m44 != 1
  • 我已经更新了这个问题。是的,它适用于单位矩阵上的乘法,但通常乘法仍然存在问题。
  • @VyachaslavGerchicov 通常乘法或转换没有任何问题。您在翻译之前使用 CATransform3DRotate ,因此您得到的结果完全符合预期。如果您最后执行旋转,您会看到 m44 值 1 被保留。
  • 我已经回答了我希望从其他人那里听到的答案。是的,没有什么毛病。不,我不能改变翻译的顺序,你应该知道——根据矩阵理论,乘法矩阵的交换会改变最终结果
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-05-08
    相关资源
    最近更新 更多