【问题标题】:get local transform between 2 matrices获得2个矩阵之间的局部变换
【发布时间】:2019-12-03 23:37:27
【问题描述】:

我想知道两个矩阵之间的局部变换。

所以例如我有这个:

Mat3 m = m3_identity();
m = mult(m, imgui.math.rotation(radians(22)));
m = mult(m, imgui.math.translation(100, 0));

Mat3 m2 = mult(m, imgui.math.rotation(radians(45)));
m2 = mult(m2, imgui.math.translation(100, 0));

Mat3 m3 = mult(m2, imgui.math.translation(100, 0));

// trash from here on

float tx = m3.m[0][2];
float ty = m3.m[1][2];

float parent_tx = m2.m[0][2];
float parent_ty = m2.m[1][2];

tx -= parent_tx;
ty -= parent_ty;

println(tx, ty); // expected 100, 0, got 39.07, 92.05

这会给:

我的目标是拥有嵌套元素,我开始使用它,但我想展示它们的值。

举个例子,在搅拌机中我们可以有嵌套元素(子元素)。

现在如果我们有最后一个立方体并查看变换属性:

从父母的角度来看它们是这样的:

所以就我而言,我想知道从 m2 看到的 m3 的变换。

所以在这种情况下应该是 x 100 和 y 0。

我该怎么做?

如果有帮助的话,我的矩阵就这样了:

static public class Mat3 {
    public float[][] m = new float[3][3];
}

【问题讨论】:

    标签: math language-agnostic coordinate-transformation


    【解决方案1】:

    要计算对象的局部平移,仅减去对象及其父对象的全局位置是不够的。在您的情况下,您获得了一个范数为 100 的向量,正如预期的那样,但它也是有方向的。要修复它,需要考虑父级的方向。具体来说,你有

    m3 = R1*T1 * R2*T2 * T3 = m2 * T3
    

    其中RiTi 是形成mm2 的旋转和平移矩阵。获取T3,计算:

    T3 = inverse(m2) * m3
    

    注意:如果第三个变换还包括旋转 (m3=m2*R3*T3),则需要计算 T3=inverse(m2*R3)*m3

    【讨论】:

    • 如果不知道第三个变换是否包含旋转怎么办?那么就不会痛吗?或者如果涉及缩放怎么办?
    • 如果第三个变换包含未知旋转,您可以使用 2x2 子矩阵提取旋转。首先计算m23=inverse(m2)*m3,然后是R3=extract_submatrix22(m23),然后是T3=inverse(R3)*m23。如果转换包含Si*Ri*Ti 形式的比例,则同样适用。
    • 是的,目前看来确实如此:)
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多