Я хочу получить широту и долготу на трехмерной сфере, в зависимости от мыши 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 в начале (от центра к краю экрана). Также мы игнорируем любое вращение.
Проблема:
Моя проблема в том, что я не получаю правильные значения. Чем дальше я отхожу от центра; тем больше становится ошибка.
Как уже упоминалось, я думаю, что это связано с тем, что я использую перспективу (Frustum). Но я не могу понять, как ее решить, и что на самом деле вызывает эту проблему.
Если это поможет, моя перспектива установлена на 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();