Math 获取两个矩阵之间的局部变换

Math 获取两个矩阵之间的局部变换,math,language-agnostic,coordinate-transformation,Math,Language Agnostic,Coordinate Transformation,我想知道两个矩阵之间的局部变换 举个例子,我有: 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

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

举个例子,我有:

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
这将使:

我的目标是有嵌套的元素,我得到了工作,但我想显示它们的值

举个例子,在blender中我们可以有嵌套的元素(子元素)

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

从家长的角度来看,他们是这样的:

所以在我的例子中,我想知道从m2看m3的变换

在这种情况下,应该是x100和y0

我该怎么做

如果有帮助,我的矩阵就是:

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

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

m3 = R1*T1 * R2*T2 * T3 = m2 * T3
其中,
Ri
Ti
是形成
m
m2
的旋转和平移矩阵。要获得
T3
,请计算:

T3 = inverse(m2) * m3

注意:如果第三次变换还包括旋转(
m3=m2*R3*T3
),则需要计算
T3=inverse(m2*R3)*m3
,如果第三次变换包括旋转未知该怎么办?那就不会痛了?或者如果涉及缩放呢?如果第三个变换包含未知旋转,则可以使用2x2子矩阵提取旋转。首先计算
m23=逆(m2)*m3
,然后
R3=提取子矩阵x22(m23)
,然后
T3=逆(R3)*m23
。如果变换包含形式为
Si*Ri*Ti
的比例,则同样适用