使用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
相关产品推荐
相关产品推荐

