从X,Y坐标计算球面上的纬度/经度?

时间:2011-05-15 00:48:48

标签: math geometry coordinates trigonometry perspective

我希望在3D球体上获得经度和经度,具体取决于鼠标X,Y。 我明白我必须使用三角学。问题是球体被置于透视中,至少我认为问题是因为我的计算:

radius *= (width / 2.0f);
    float y = (mouseY - (height / 2.0f)) / radius;
    latitude = (float) -Math.toDegrees(Math.asin(y));

和经度:

    float x = (float) ((mouseX - (width / 2.0f)) / (radius));
    longitude = (float) (90 - Math.toDegrees(Math.acos(x)));

为简单起见,半径= 1(从屏幕的中心到边缘)。我们也忽略任何轮换。

问题:
我的问题是我没有得到正确的价值观。我越远离中心;错误越大。
如上所述,我想这与我使用透视(视锥体)的事实有关。但我无法弄清楚如何解决它,以及究竟是什么导致了这个问题。

如果有任何帮助,我的视角设置为45度,我的宽度/高度比率为0.6。因此,这个fromula:tan(2 * atan(1,x)/0.6)= x,我将球体x(〜-4.17)翻译成屏幕(z)。

我的预测:

        gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity();

   GLU.gluPerspective(gl, 45f, (float) width / (float) height, 0.1f,
            100.0f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glLoadIdentity();

1 个答案:

答案 0 :(得分:2)

您需要做的是找到从相机原点开始并通过鼠标光标位置的眼睛平面的光线。这可以通过将透视投影变换的反转应用于鼠标光标的视口坐标来获得表示鼠标位置的世界空间点来完成。

此光线与球体的交点(如果存在)将是一个表面点,可用于计算纬度和经度值,使用简单的三角函数。