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的滚动缩放依赖场景整体边界盒计算缩放范围,缺失正确边界盒会导致相机逻辑异常。以下是修复步骤:
- 添加自定义几何体后,手动计算并设置模型的边界盒
- 更新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




