Вычисление широты/долготы на сфере по координатам X, Y?

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

person Henrik    schedule 15.05.2011    source источник


Ответы (1)


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

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

person kqnr    schedule 15.05.2011
comment
Ладно, это кажется логичным! Последние 6 часов пытались понять, что не так, к черту, и только начинали почти с нуля.. В любом случае, спасибо! - person Henrik; 15.05.2011
comment
Хм, можно ли получить преобразование перспективной проекции в OpenGL-ES? Если да, то возможно вы знаете как? Поскольку кажется, что я не могу использовать ни gl.glGetFloatv, ни GLfloat - person Henrik; 15.05.2011
comment
Мои знания о GLES ограничены, но я понимаю, что вы правы насчет glGetFloatv et al, по крайней мере, в GLES 1.0. Как вы настраиваете перспективную проекцию в первую очередь? Создать матрицу обратной проекции вручную не составит труда, если вы знаете, как формируется проекция. - person kqnr; 15.05.2011
comment
Еще раз спасибо за помощь. Там не так много, но я отредактировал свой исходный пост, чтобы включить код, в котором я выбираю свою точку зрения. - person Henrik; 15.05.2011