模型放大操作时如何设置查看器的缩放枢轴点
原生查看器实现BIM360式鼠标位置缩放枢轴点方案
经实测,BIM360查看器缩放时自动对齐鼠标悬停位置的枢轴点逻辑,原生Viewer确实没有默认开启,核心要解决的就是实时获取鼠标停留位置对应的模型表面3D坐标,直接用查看器内置的射线检测接口就能实现,不需要自己做复杂的坐标转换。
实现步骤
- 监听画布的鼠标移动事件,把鼠标的客户端坐标转换为查看器识别的归一化屏幕坐标
- 调用查看器内置的hitTest接口做射线拾取,命中模型时直接取返回结果里的3D点位
- 滚轮缩放事件触发时,提前把拿到的3D点位传入
setPivotPoint接口即可
核心实现代码
let hoverPoint = null; const canvas = viewer.canvas; // 实时拾取鼠标悬停的模型表面点位 canvas.addEventListener('mousemove', (e) => { const canvasRect = canvas.getBoundingClientRect(); // 坐标转换为Viewer要求的[-1,1]归一化范围 const normX = ((e.clientX - canvasRect.left) / canvasRect.width) * 2 - 1; const normY = -((e.clientY - canvasRect.top) / canvasRect.height) * 2 + 1; // 射线检测,第三个参数传true表示忽略透明构件命中 const hitRes = viewer.impl.hitTest(normX, normY, true); hoverPoint = hitRes ? hitRes.point : null; }); // 缩放前设置枢轴点 canvas.addEventListener('wheel', () => { if (hoverPoint) { viewer.navigation.setPivotPoint(hoverPoint); } }, { capture: true, passive: true });
优化提示:如果要完全对齐BIM360的交互体验,可以给鼠标移动事件加节流,避免高频触发hitTest造成性能损耗;如果鼠标悬停在空白区域没有命中模型,直接走查看器默认枢轴逻辑即可,不需要强制设置点位。
内容的提问来源于stack exchange,提问作者Neil Wang
相关产品推荐
相关产品推荐

