1

我想获得 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。因此使用这个公式: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();
4

1 回答 1

2

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

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

于 2011-05-15T00:56:58.833 回答