You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js升级后旋转/缩放Mesh时位置异常问题求助

Three.js v0.167.1 TransformControls 旋转/缩放时模型位置偏移修复

Three.js从v0.96.0到v0.167.1的大版本升级中,TransformControls的核心行为(尤其是轴心点、空间变换逻辑)有不少调整,导致旧代码出现旋转/缩放时位置偏移的问题。以下是针对性的修复方案:

1. 强制设置局部空间变换模式

旧版本TransformControls默认隐式使用局部空间,而新版本默认是世界空间。显式设置为局部空间可匹配旧行为:

// 创建TransformControls时添加
const controls = new THREE.TransformControls(camera, renderer.domElement);
controls.setSpace('local'); // 关键:指定以模型自身坐标系为基准变换
scene.add(controls);

2. 显式绑定模型几何中心为变换轴心

新版本中TransformControls不再自动将模型几何中心作为默认轴心,需手动计算并设置:

// 模型加载完成后执行
const mesh = 你的Mesh实例;

// 计算几何体中心
mesh.geometry.computeBoundingBox();
const center = new THREE.Vector3();
mesh.geometry.boundingBox.getCenter(center);

// 设置变换轴心并绑定模型
controls.setPivot(center);
controls.attach(mesh);

如果不需要移动几何体本身,仅调整变换轴心,用上述代码即可;如果希望几何体自身居中到局部原点,可额外执行mesh.geometry.center()。

3. 确保模型矩阵自动更新正常

若你手动修改过模型的matrix属性并关闭了自动更新,会导致TransformControls计算错误:

// 确保开启自动更新(默认是true,若被修改则恢复)
mesh.matrixAutoUpdate = true;
// 强制更新一次矩阵(可选,修复初始状态异常)
mesh.updateMatrixWorld(true);

4. 排查父节点变换干扰

如果模型嵌套在父对象下,父对象的非单位变换(如缩放、旋转)会影响TransformControls的计算。可临时将模型直接添加到场景根节点测试,若问题消失,需调整父节点的变换设置,或给TransformControls指定父对象的空间:

// 若模型有父节点,设置TransformControls以父节点空间为基准
controls.setSpace('local');
controls.attach(mesh);
// 或者确保父节点的矩阵是单位矩阵(无额外缩放/旋转)
parentMesh.scale.set(1,1,1);
parentMesh.rotation.set(0,0,0);
parentMesh.updateMatrixWorld(true);

内容的提问来源于stack exchange,提问作者yash chapani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:07:31