Я хочу получить широту и долготу на трехмерной сфере в зависимости от мыши 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();