精确点在一个旋转的球体上

我有一个球体,代表地球纹理与真实的图片。 它围绕X轴旋转,当用户点击它时,必须向我显示他点击的确切位置。 例如,如果他点击新加坡,系统应该能够:

  • 了解用户点击球体(好的,我会用unProject来做)
  • 了解用户点击球体(射线球碰撞?)的位置并考虑旋转
  • 将球坐标转换为适合某些web-api服务的坐标系
  • 询问api(好吧,这对我来说是比较简单的事情;-)

一些忠告?

威尔的答案是完美的,直到你想做一些位移(如果模拟行星,你想要的话)。

在我看来,颜色select将是最好的解决scheme。 实现和处理o(log(n))复杂性(+渲染时间)是快速的。 球体上的每个三角形都将具有独特的颜色。 渲染行星只有颜色,没有照明与屏幕相同的分辨率。 获取点击点,并在屏幕上的相同位置,检查颜色。 用颜色查找对象。 对象可以简单地sorting(颜色是数字),因此可以使用log(n)复杂度的二进制search。

我们使用这个简单和老时尚技术为我们的比赛保存我们! 用于在地球占领地区而不会造成性能损失 。 所以我可以告诉你,它适合于实时应用。

打开简单的方法是颜色select 。

创建纹理球体的两个版本的世界地图纹理。 第一个是供用户查看,第二个是供select的。 第二,每个国家都以独特的色彩绘制。

当用户点击时,渲染没有光照或其他效果的场景,并使用第二种颜色编码的纹理。 不要交换缓冲区 – 不要向用户显示这个版本。 但是,然后阅读使用glReadPixels的颜色值在上面的文章中。

你的方法看起来不错。 假设OpenGL,每个步骤的一些链接:

  1. gluUnproject的x,y(必要时翻转y;点击的屏幕坐标通常是0,0是屏幕的左上角,而OpenGL 0,0是左下角),用于near( 0.0 )和far( 1.0 )。 这给你一个线段,这是从你的鼠标光标投射到场景的光线。 ( gluUnproject已被弃用,所以你可能想复制粘贴到你的代码从这里 。)

  2. 从这个优秀的页面find线路交叉码。

  3. 反转最近交点的旋转以考虑球体的旋转,例如调整它 。