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

使用viewer.impl.rayIntersect()设置网格位置存在偏移问题求助

解决方法
  • 修正相交结果的取值逻辑:viewer.impl.rayIntersect返回的是相交结果数组,不是单个对象。必须先判断数组非空,再取第一个交点的坐标:

    const intersects = viewer.impl.rayIntersect(rayCaster.ray, true);
    if (intersects.length > 0) {
      const intPt = intersects[0].intersectPoint;
      sphereMesh.position.set(intPt.x, intPt.y, intPt.z);
      viewer.overlays.addMesh(sphereMesh, "viewer-scene");
    }
    
  • 用Viewer内置方法生成射线:避免Three.js原生射线的坐标系偏差,改用Viewer适配后的方法获取射线:

    // 基于鼠标点击事件生成射线
    const screenPoint = new THREE.Vector2(event.clientX, event.clientY);
    const ray = viewer.utilities.getRayFromScreenPoint(screenPoint);
    const intersects = viewer.impl.rayIntersect(ray, true);
    
  • 重置网格变换属性:确保球体网格没有残留的缩放、旋转等变换,强制更新矩阵:

    sphereMesh.scale.set(1, 1, 1);
    sphereMesh.rotation.set(0, 0, 0);
    sphereMesh.position.set(intPt.x, intPt.y, intPt.z);
    sphereMesh.updateMatrixWorld(true);
    
  • 触发Viewer渲染更新:添加网格后手动触发渲染,确保坐标生效:

    viewer.impl.invalidate(true);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:01:11