【问题标题】:Find transformation matrix between two matrices找到两个矩阵之间的变换矩阵
【发布时间】:2018-08-31 18:40:12
【问题描述】:

我试图找到两个矩阵之间的变换矩阵,所以我可以保存它,然后将它应用到一个对象上,这样它将保持其相对于另一个对象的位置和旋转。使用这个建议的解决方案:

3d (THREE.js) : difference matrix

我使用了这个代码:

var aInv1 = new THREE.Matrix4().getInverse(firstObject.matrix.clone());
var aMat2 = new THREE.Matrix4().copy(secondObject.matrix.clone());
var aTrans = new THREE.Matrix4().multiplyMatrices(aMat2, aInv1);

矩阵元素的值是:

firstObject.matrix.elements = [ 
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, -358.483421667927, 1
]

secondObject.matrix.elements = [
    0.5137532240102918, -0.844167465362402, 0.15309773101731067, 0,
    0.8579380075617532, 0.5055071032079361, -0.091678480502733, 0,
    -1.3877787807814457e-17, 0.1784484772418605, 0.983949257314655, 0,
    94.64320536824728, 6.92473686011361, -372.0695450875709, 1
]

我希望转换矩阵又名变量aTrans 元素将是94.64320536824728, 6.92473686011361, 13.58,因为这些是位置的差异,但我得到94.64320536824728, 70.89555757320696, -19.340048577797802, 1

aTrans.matrix.elements = [
    0.5137532240102918, -0.844167465362402, 0.15309773101731067, 0,
    0.8579380075617532, 0.5055071032079361, -0.091678480502733, 0,
    -1.3877787807814457e-17, 0.1784484772418605, 0.983949257314655, 0,
    94.64320536824728, 70.89555757320696, -19.340048577797802, 1
]

我会为这种差异提供任何有根据的解释,或者解决这个问题的其他方法。

【问题讨论】:

  • 只是指出通过数学/矩阵标签到达这里的任何人,three.js 使用列优先矩阵(在这种情况下并不重要)。
  • 你能计算aTrans.aMat1吗?

标签: math three.js matrix-multiplication


【解决方案1】:

您不能简单地添加翻译,因为第二个矩阵可能会影响第一个矩阵的有效翻译。

让我们考虑一个简单的例子 - 假设两个矩阵都只包含旋转和平移:

M = R + T

R 对应左上角的 3x3 子矩阵,T 是最后一列的前 3 个元素。任意3D点的乘法规则p

M * p = R * p + T

其中两个给出:

M2 * M1 * p = R2 * R1 * p + R2 * T1 + T2

M2 * M1 的最后一列是R2 * T1 + T2 而不是简单的T1 + T2,即M1p 施加的有效翻译是R2 * T1,而不仅仅是@987654333 @。

【讨论】:

  • 你对 (p) 有什么看法?
  • @tlatis 任何你想用矩阵变换的点。
猜你喜欢
  • 1970-01-01
  • 2022-11-21
  • 2018-05-02
  • 1970-01-01
  • 2015-08-28
  • 2017-01-02
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多