Вычислить широту / долготу на сфере по координатам X, Y? - PullRequest
1 голос
/ 15 мая 2011

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

1 Ответ

2 голосов
/ 15 мая 2011

Что вам нужно сделать, это найти луч, который начинается в начале камеры и проходит через плоскость глаза в позиции курсора мыши.Это можно сделать, применив обратное преобразование вашей проекции перспективы к координатам области видимости курсора мыши, чтобы получить точку в мировом пространстве, представляющую положение мыши.

Пересечение этого луча с вашей сферой, если она существует, будет точкой поверхности, которую вы можете использовать для вычисления значений широты и долготы, используя простую тригонометрию.

...