Three加载模型,模型不在原点的解决方式

📅 发布时间:2026/7/8 0:28:24 👁️ 浏览次数:
Three加载模型,模型不在原点的解决方式
方法一//调整模型到原点并缩放到合适大小functioncenterGeometry(model:any){// 先计算整体包围盒constboxnewTHREE.Box3().setFromObject(model);constcenterbox.getCenter(newTHREE.Vector3());// 递归处理所有网格model.traverse((child:any){if(child.isMesh){constgeometrychild.geometry;// 平移顶点位置constpositionAttrgeometry.attributes.position;for(leti0;ipositionAttr.count;i){constxpositionAttr.getX(i)-center.x;constypositionAttr.getY(i)-center.y;constzpositionAttr.getZ(i)-center.z;positionAttr.setXYZ(i,x,y,z);}positionAttr.needsUpdatetrue;geometry.computeBoundingBox();// 更新包围盒geometry.computeBoundingSphere();}});// 将整个模型的位置归零因为顶点已经偏移model.position.set(0,0,0);}//加载模型loader.load(modelPath,(gltf){console.log(模型加载成功,gltf);modelgltf.scene;centerGeometry(model)scene?.add(model);},// 加载进度回调(xhr){console.log(加载进度${(xhr.loaded/xhr.total)*100}%);},// 加载错误回调(error){console.error(模型加载失败,error);});*这种方式可能会导致模型的组件漂浮 *方法二推荐// 通过平移根节点使模型居中functioncenterModelByTranslation(model:THREE.Object3D){constboxnewTHREE.Box3().setFromObject(model);constcenterbox.getCenter(newTHREE.Vector3());model.position.sub(center);// 整个模型平移 -center}loader.load(modelPath,(gltf){console.log(模型加载成功,gltf);modelgltf.scene;// 将模型中心移至原点只移动根节点centerModelByTranslation(model);scene?.add(model);},// 加载进度回调(xhr){console.log(加载进度${(xhr.loaded/xhr.total)*100}%);},// 加载错误回调(error){console.error(模型加载失败,error);});