如何在Viewer中实现类似测距工具的模型点捕捉功能?
在Autodesk Viewer中实现类似测距工具的模型点捕捉功能
你当前使用的hitTest方法是获取模型点的基础方式,但要实现内置测距工具那样的精准几何捕捉(比如吸附顶点、边中点、面中心),可以直接利用Viewer内置的SnappingManager来完成,无需手动处理复杂的几何判断。
实现步骤
启用并配置内置捕捉工具
先注册并激活SnappingTool,同时根据需求设置捕捉模式和精度:// 注册并启用捕捉工具 viewer.toolController.registerTool(new Autodesk.Viewing.Extensions.Snapping.SnappingTool(viewer)); viewer.setActiveSnappingTool(true); // 配置捕捉选项:选择需要的捕捉类型 const snappingManager = viewer.snappingManager; snappingManager.setSnapModes([ Autodesk.Viewing.Snapping.SNAP_VERTEX, // 顶点捕捉 Autodesk.Viewing.Snapping.SNAP_EDGE_MIDPOINT,// 边中点捕捉 Autodesk.Viewing.Snapping.SNAP_FACE_CENTER // 面中心捕捉 ]); snappingManager.setSnapTolerance(10); // 捕捉像素容忍度,值越小越精准在鼠标事件中获取捕捉点
替换原有的hitTest逻辑,优先通过SnappingManager获取捕捉结果,未捕捉到时再用hitTest作为降级方案:document.addEventListener('click', (event) => { // 获取捕捉结果 const snapResult = viewer.snappingManager.getSnapResult(event.clientX, event.clientY); if (snapResult) { const snappedPoint = snapResult.point; // 捕捉到的三维坐标点 console.log('捕捉到的点:', snappedPoint); // 后续可用于绘制测距线、标记点等操作 } else { // 降级到原始hitTest逻辑 const pt = viewer.impl.hitTest( event.clientX, event.clientY, true, null, [mModel.getModelId()] ); if (pt) { console.log('HitTest 获取的点:', pt.intersectPoint); } } });可选:过滤特定模型捕捉
如果只需要捕捉指定模型的几何点,可添加模型过滤规则:snappingManager.addModelFilter(model => model.getModelId() === mModel.getModelId());可选:监听捕捉实时状态
可以监听捕捉事件,实时获取捕捉过程中的反馈:viewer.addEventListener(Autodesk.Viewing.Snapping.SNAP_EVENT, (event) => { console.log('当前捕捉到的几何元素:', event.result); });
优势说明
内置的Snapping工具已经封装了测距工具同款的捕捉逻辑,包括捕捉点高亮、自动吸附几何特征等,比手动处理hitTest更稳定、更贴合官方工具的交互体验。
内容的提问来源于stack exchange,提问作者Tim Huang
相关产品推荐
相关产品推荐

