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

Three.js中3D模型轨道运动时替换几何体后模型消失问题排查

问题分析与解决

你直接从gltfScene.scene获取geometry和material是错误的——THREE.Scene对象本身没有这两个属性,它只是一个容纳模型、灯光等元素的容器,里面的3D模型是以Mesh(或其他Object3D子类)的形式存在于scene.children中的。你之前用BoxGeometry能正常显示是因为手动创建了有效的几何体和材质,而现在用undefined的geometry/material创建Mesh,自然不会渲染出任何内容。

正确的实现方式

方式1:直接复用加载后的模型Mesh

不需要重新创建Mesh,直接把加载好的模型添加到pivot上:

// 遍历GLTF场景,找到所有Mesh(处理嵌套模型的情况)
function traverseScene(scene, callback) {
  scene.traverse((child) => {
    if (child.isMesh) {
      callback(child);
    }
  });
}

// 在GLTFLoader的回调里
let pivot = new THREE.Object3D();
pivot.rotation.z = 0;
gltfScene.scene.add(pivot);

traverseScene(gltfScene.scene, (mesh) => {
  // 复制模型(避免修改原场景的模型)
  const clonedMesh = mesh.clone();
  clonedMesh.position.y = 2;
  // 调整缩放(如果模型大小不合适)
  clonedMesh.scale.set(1, 1, 1);
  pivot.add(clonedMesh);
});

方式2:提取模型的几何体和材质创建新Mesh

如果确实需要重新创建Mesh,要从场景中的Mesh对象里取geometry和material:

let pivot = new THREE.Object3D();
pivot.rotation.z = 0;
gltfScene.scene.add(pivot);

// 找到第一个Mesh(如果模型结构简单,只有一个Mesh)
const originalMesh = gltfScene.scene.children.find(child => child.isMesh);
if (originalMesh) {
  // 注意:如果模型有多个材质,需要用originalMesh.material数组
  const mesh = new THREE.Mesh(originalMesh.geometry, originalMesh.material);
  mesh.position.y = 2;
  // 按需调整缩放
  mesh.scale.set(0.5, 0.5, 0.5);
  pivot.add(mesh);
}

关于缩放的问题

如果模型显示异常(比如太大/太小看不见),可以通过调整mesh.scale来修正。加载的GLTF模型可能自带缩放,你可以打印originalMesh.scale查看默认值,再调整到合适的大小。

内容的提问来源于stack exchange,提问作者Joe Moore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:54:22