点击一个球(clicking on a sphere)

2019-07-20 04:30发布

我有一个单位球面(半径为1),其被在正交投影取用居中。

球体可自由旋转。

我怎么能确定的是,用户点击球点?

Answer 1:

鉴于:

  • 显示器的高度和宽度
  • 投影圆的半径,以像素为单位
  • 用户点击该点的坐标

并假定左上角为(0,0),为您的旅行到右侧的x值增大,而y值增加为您的旅行下来。

翻译用户的点击点到全球的坐标空间。

userPoint.x -= monitor.width/2
userPoint.y -= monitor.height/2
userPoint.x /= circleRadius
userPoint.y /= circleRadius

找到交叉点的Z坐标。

//solve for z
//x^2 + y^2 + z^2 = 1
//we know x and y, from userPoint
//z^2 = 1 - x^2 - y^2
x = userPoint.x
y = userPoint.y

if (x^2 + y^2 > 1){
    //user clicked outside of sphere. flip out
    return -1;
}

//The negative sqrt is closer to the screen than the positive one, so we prefer that.
z = -sqrt(1 - x^2 - y^2);

现在你知道路口(X,Y,Z)点,你可以找到lattitude和经度。

假定面向使用者的眼球的中心是0E 0N,

longitude = 90 + toDegrees(atan2(z, x));
lattitude = toDegrees(atan2(y, sqrt(x^2 + z^2)))

如果球被旋转,使得0E子午线不直接面对观察者,从经度减去旋转角度。



Answer 2:

一种可能的方法是生成从三角形的球体,由行和列组成。 它们可以是无形也。 然后点击测试这些三角形,用鼠标挑线。

看到这张图片的经/纬度格,但其应用更加密集。 对于每个网格单元,则需要2个三角形。



文章来源: clicking on a sphere