首页 > 解决方案 > 三,更新对象的矩阵不会改变它的位置和旋转参数

问题描述

我想在创建时为对象设置一个变换矩阵,然后通过位置、旋转和缩放来控制它,但是虽然更改矩阵确实会更改世界空间中的对象,但它的位置参数仍然保持为 0、0、0。

let mesh =  new THREE.Mesh(
    new THREE.BoxGeometry(),
    new THREE.MeshPhongMaterial({color:0xf15728})
)
this.scene.add(mesh)

let pos = new THREE.Vector3().setFromMatrixPosition(m)

mesh.matrixAutoUpdate = false
mesh.matrix.copy(m)

// ***************//
mesh.updateMatrix()
// ***************//

console.log("mesh.position", mesh.position)
console.log("pos", pos)

pos这是两者的值的输出mesh.position

在此处输入图像描述

标签: matrixthree.jstransformation

解决方案


更新对象matrix不会更新其位置或旋转字段,默认情况下,three.js 将在渲染之前根据 、 和 值更新矩阵positionrotationscale已通过设置matrixAutoUpdate为 false 禁用)。

如果您想从矩阵初始化对象转换,可以使用Matrix4.decompose函数,如下所示:

// m is the initial local matrix transform
m.decompose(
  mesh.position,
  mesh.quaternion,
  mesh.scale,
);

此外,如果您保留,则无论何时更改、或值,您都必须在渲染之前mesh.matrixAutoUpdate = false调用。mesh.updateMatrix()positionrotationscale

您可以在此处阅读有关矩阵变换如何工作的更多信息。


推荐阅读