我有两组三个对应的(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
空间。
我的思考过程是:
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,
)
const M = bMatrix.clone().multiply(aMatrix.clone().invert())
mesh
空间中有一个网格 a
,我想我能够做到:mesh.matrix.setFromMatrix3(M)
并查看网格缩放并旋转到
b
空间中。
但这似乎不起作用——生成的模型是倾斜的,而不是旋转/缩放的。与基于向量的变换相比,我对矩阵变换不太熟悉,所以不确定我是否遗漏了某些内容或者我的过程是否不正确 -对此有什么想法吗?预先感谢。
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_algorithm(reference)。