我想获得 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();