You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ModelBuilder问题:滚动缩放时对象消失如何解决?

问题

通过Viewer的SceneBuilder添加自定义几何体后,出现以下异常:

  • 可正常平移相机,但滚动缩放时画布变空白,相机仿佛被移到极远处
  • 工具栏中的缩放工具可正常使用
  • 双击画布或点击主页图标重置视图后,有时滚动缩放功能恢复正常

相关代码:

viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, async function onceLoaded() {
  viewer.removeEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, onceLoaded);

  const sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
  const modelBuilder = await sceneBuilder.addNewModel({
    conserveMemory: false,
  });
});
解决方案

这个问题的核心是自定义模型的边界盒未正确初始化,Viewer的滚动缩放依赖场景整体边界盒计算缩放范围,缺失正确边界盒会导致相机逻辑异常。以下是修复步骤:

  1. 添加自定义几何体后,手动计算并设置模型的边界盒
  2. 更新Viewer场景边界,让相机识别正确的缩放范围

示例代码:

viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, async function onceLoaded() {
  viewer.removeEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, onceLoaded);

  const sceneBuilder = await viewer.loadExtension('Autodesk.Viewing.SceneBuilder');
  const modelBuilder = await sceneBuilder.addNewModel({
    conserveMemory: false,
  });

  // 假设已完成自定义几何体的添加,例如创建了网格对象
  // 计算模型的整体边界盒
  const modelBbox = new THREE.Box3();
  modelBuilder.model.getMeshProxy().traverse(child => {
    if (child.isMesh) {
      modelBbox.expandByObject(child);
    }
  });

  // 重载模型的边界盒获取方法
  modelBuilder.model.getBoundingBox = () => modelBbox.clone();

  // 更新Viewer场景并重置视图
  viewer.impl.sceneUpdated(true);
  viewer.fitToView();
});

若问题仍存在,可尝试调整相机参数优化缩放逻辑:

// 调整滚动缩放速度
viewer.navigation.setZoomSpeed(2.0);
// 扩大近远裁剪面比例,避免几何体被裁剪
viewer.navigation.setNearFarRatio(0.0001);
说明

Viewer的滚动缩放功能默认依赖所有模型的边界盒来确定合理的视野范围。通过SceneBuilder创建的自定义模型不会自动生成正确的边界盒,导致Viewer使用异常的边界值计算相机位置,最终出现画布空白。手动设置边界盒后,Viewer能正确识别场景范围,恢复滚动缩放的正常逻辑。

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

火山引擎 最新活动