根据对应点计算变换矩阵(ThreeJS)

问题描述 投票:0回答:1

我有两组三个对应的(x,y)点,

a
b

// (example values, not actual)
const a = [[1, 1], [2, 2], [3, 3]]
const b = [/* etc, same format as `a` */]

我正在使用 ThreeJS 并尝试提出一种通用方法来创建一个转换矩阵,将

a
空间中的任何点转换为
b
空间。

我的思考过程是:

  1. 将每组点转换为矩阵:
const aMatrix = new THREE.Matrix3(
  a[0][0], a[0][1], 1,
  a[1][0], a[1][1], 1,
  a[2][0], a[2][1], 1,
)

const bMatrix = new THREE.Matrix3(
  b[0][0], b[0][1], 1,
  b[1][0], b[1][1], 1,
  b[2][0], b[2][1], 1,
)
  1. 如果我对矩阵 M 的想法是正确的,M(aMatrix) = bMatrix,则 M = bMatrix(aMatrix-1)。在三中,我认为这将转化为:
const M = bMatrix.clone().multiply(aMatrix.clone().invert())
  1. 然后,如果我在
    mesh
    空间中有一个网格
    a
    ,我想我能够做到:
mesh.matrix.setFromMatrix3(M)

并查看网格缩放并旋转到

b
空间中。

但这似乎不起作用——生成的模型是倾斜的,而不是旋转/缩放的。与基于向量的变换相比,我对矩阵变换不太熟悉,所以不确定我是否遗漏了某些内容或者我的过程是否不正确 -对此有什么想法吗?预先感谢。

math matrix three.js 3d transformation
1个回答
0
投票
Three.js 中的

Matrix3
并不意味着传达“位置”,它们是
transform matrix
并且
Mesh
使用
Matrix4
文档)。

变换矩阵组合:

  • 平移矩阵;
  • 缩放矩阵;
  • 旋转矩阵。

对于您的点

2)
,如果您使用两组点创建两个网格并获取它们的变换矩阵,它们将不包含变换(
Identity Matrix
),因此,该操作将为您提供一个
Identity Matrix 
导致没有转换(https://codepen.io/trinketmage/pen/MWxGeqd)。为了使该操作有意义,您需要不同的变换矩阵。

我不想误导,但据我所知,没有办法用 Three.js 中的实际 API 从两组 3D 坐标计算变换矩阵。但我相信这个问题可能有一种算法方法:https://en.wikipedia.org/wiki/Kabsch_algorithmreference)。

© www.soinside.com 2019 - 2024. All rights reserved.