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

模型放大操作时如何设置查看器的缩放枢轴点

原生查看器实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:15:44