Сбор лучей с помощью gluUnProject () - PullRequest
1 голос
/ 02 декабря 2010

У меня есть четырехугольник на плоскости у = -50. На данный момент все, что я хочу сделать, это получить координаты щелчка мышью на квад. Мне удалось сделать это в ограниченной степени. Проблема в том, что преобразования, которые я применил при рисовании квадрата, не учитываются. Я могу добавить некоторые константы и заставить это работать, но я позволяю пользователю вращать сцену вокруг осей x и y с помощью glRotatef (), поэтому координаты портятся, как только происходит вращение.

Вот что я сейчас делаю:

Я вызываю gluUnProject () дважды, один раз с z = 0 и один раз с z = 1.

gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 0, modelView, projection, viewport, &x1, &y1, &z1);
gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 1, modelView, projection, viewport, &x2, &y2, &z2);

Нормализованный лучевой вектор:

x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
mag = sqrt(x*x + y*y + z*z);
x /= mag;
y /= mag;
z /= mag;

Параметрическое уравнение:

float t = -(camY) / y;
planeX = camX + t*x;
planeY = camY + t*y;
planeZ = camZ + t*z;

где (camX, camY, camZ) - позиция камеры, переданная в gluLookAt ().

Я хочу, чтобы плоскости X, плоскость Y и плоскость Z были координатами щелчка по четырехугольнику, в той же системе координат, которую я использовал для рисования четырехугольника. Как мне этого добиться?

1 Ответ

1 голос
/ 04 февраля 2011

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

GLfloat depth;
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

Передача этого значения в ваш gluUnProject должна дать значения, которые вы ищете.Кроме того, как сказал genpfault в своем комментарии, убедитесь, что вы получаете данные матрицы представления модели в нужный момент.В противном случае у вас неправильная матрица.

...