Javascript 3.js反向光线投射

Javascript 3.js反向光线投射,javascript,css,three.js,Javascript,Css,Three.js,我正在一个弯曲的平面上建立一个世界地图,用户可以旋转并高亮显示国家。单击某个国家时,我会确定到底单击了什么,然后显示工具提示,其中包含有关选定国家的一些信息,如下面的屏幕截图所示: 贴图本身是由三个部分生成的,但是工具提示是一个常规的老div。问题是,我希望工具提示保持与纹理的特定点粘合,即使平面旋转。工具提示的原始位置基于光线投射器的信息。因此,我希望应用程序返回该精确点相对于容器(或窗口)的当前位置,例如基于uv坐标。如何实现这一点?基于@prisoner849提供的链接,我实现了以下解决

我正在一个弯曲的平面上建立一个世界地图,用户可以旋转并高亮显示国家。单击某个国家时,我会确定到底单击了什么,然后显示工具提示,其中包含有关选定国家的一些信息,如下面的屏幕截图所示:


贴图本身是由三个部分生成的,但是工具提示是一个常规的老div。问题是,我希望工具提示保持与纹理的特定点粘合,即使平面旋转。工具提示的原始位置基于光线投射器的信息。因此,我希望应用程序返回该精确点相对于容器(或窗口)的当前位置,例如基于uv坐标。如何实现这一点?

基于@prisoner849提供的链接,我实现了以下解决方案:

a) 在mouseup事件中,我设置了一个新的工具提示3D原点(只有在鼠标位置没有明显的增量时,才能区分单击和拖动相机)

b) 每帧触发以下函数,该函数将三维坐标转换为二维坐标,并计算工具提示的位置:

function setTooltipOrigin( camera, renderer, tooltip, lastClickPoint ) {
  var canvas = renderer.domElement,
  point = new THREE.Vector3();

  point.x = lastClickPoint.x,
  point.y = lastClickPoint.y,
  point.z = lastClickPoint.z,

  point.project( camera );

  point.x = Math.round(( 0.5 + point.x / 2 ) * ( canvas.width / window.devicePixelRatio ));
  point.y = Math.round(( 0.5 - point.y / 2 ) * ( canvas.height / window.devicePixelRatio ));

  point.x -= 14; //small adjustment to the position, so the line points to the click point
  point.y -= (tooltip.scrollHeight * 0.7); //same for y

  tooltip.style.transform = 'translate(' + point.x + 'px, ' + point.y + 'px)';
}

可能是helpful@prisoner849谢谢,这正是我需要的。我根据文章添加了一个答案(不客气)