Перечень мышиных координат - PullRequest
2 голосов
/ 04 декабря 2011

Я пытаюсь получить декартовы координаты точки, для которой я использую простую функцию, оставляющую координаты окна, что-то вроде (100,200). Я хочу преобразовать это в декартовы координаты, проблема в том, что размер окна является переменным, поэтому я действительно не знаю, как это реализовать.

Edit:

Op:

Я пытался использовать guUnPorject, делая что-то вроде этого

GLdouble modelMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix);
GLdouble projMatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX,projMatrix);


double position[3];
 gluUnProject(
  x,
   y,
  1,
 modelMatrix,
 projMatrix,
 viewport,
 &position[0], //-> pointer to your own position (optional)
 &position[1], // id
 &position[2] // 
 );

 cout<<position[0];

Однако позиция, которую я получил, кажется совершенно случайной

1 Ответ

2 голосов
/ 04 декабря 2011

Координаты мыши уже в декартовых координатах, а именно координаты пространства окна.Я думаю, что вы ищете, это превращение в мировое пространство вашей OpenGL-сцены.В двухмерных координатах мыши в окне отсутствует некоторая информация: глубина.

Так что вы можете увидеть на самом деле луч от «камеры» в сцену.Для этого вам необходимо выполнить обратную проекцию из экранного пространства в мировое пространство.Для этого вы берете матрицу проекции P и матрицу вида V (которая генерируется с помощью gluLookAt или аналогичной), формируете произведение P * V и инвертируете его, т. Е. (P * V) ^ - 1 = V ^ -1 * P ^ -1.Обратите внимание, что инверсия не является транспозицией.Инвертирование матрицы выполняется методом исключения Гаусса-Джордана, предпочтительно с некоторым поворотом.Любой математический учебник по линейной алгебре объясняет это.

Тогда вам нужно два вектора для формирования луча.Для этого вы берете две позиции на экране с одинаковыми координатами XY, но разной глубиной (скажем, 0 и 1) и выполняете обратную проекцию:

(P*V)^-1 * (x, y, {0, 1})

Разница результирующих векторов дает направление луча.

Весь процесс обратного проецирования был включен в gluUnProject.Однако я рекомендую не использовать его в форме GLU, а либо посмотреть на исходный код, чтобы поучиться у него, либо использовать современную замену, как это предлагает GLM.

...