2010-12-02 1 views
1

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

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

Я называю gluUnProject() дважды, один раз с г = 0, и один раз с г = 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, planeY и planeZ были координатами щелчка на квадроцикле, в той же системе координат, что и для рисования квадроцикла. Как я могу это достичь?

+0

Когда вы получаете матрицу modelView? До или после `glRotatef()`? – genpfault 2010-12-02 16:52:17

ответ

1

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

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

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