Какую систему координат дает мне gluUnProject? - PullRequest
2 голосов
/ 15 ноября 2011

enter image description here

Как показано на рисунке, мой объект имеет свою собственную "локальную систему координат" (на самом деле у меня есть точечное облако вместо меша)

Затем я применяю преобразования / масштабирование и т. Д. К матрице ModelView, и преобразованная система координат - это "система координат просмотра модели".

Теперь я пытаюсь выбрать «вершину» с помощью gluUnproject следующим образом.

GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;


glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);

winX = (GLfloat) mousePosition.x();
winY = (GLfloat) viewport[3] - (float) mousePosition.y();
glReadPixels((int)winX , int(winY) , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT,&winZ);

GLdouble posX, posY, posZ;
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

Должен ли этот "gluUnProject" указывать местоположение относительно "локальной системы координат" или относительно "системы координат вида модели"?

1 Ответ

5 голосов
/ 15 ноября 2011

Представление модели - это не (конкретная) система координат, а преобразование из локального пространства объекта (модель-) в пространство глаза (-вид).

На картинке выше мы видим пространство объекта (штатив "в" чайнике) и мировое пространство (большой штатив). Но есть и глазное пространство, для которого не требуется штатив, хотя мы можем представить его достаточно легко: одна вертикальная ось вверх и одна горизонтальная ось прямо посередине и ось, торчащая из картинки.

То, что мы не «видим», - это проекция, то есть преобразование, которое проецирует изображение на экран (технически обрезает пространство, затем оттуда в NDC дополнительным шагом).

Итак, у нас есть следующие преобразования:

  • ModelView, MV, из пространства объектов в пространство глаз (это полностью обходит мировое пространство)
  • Проекция P, из мирового пространства в пространство экрана.

Вершина проходит через эти

 v_eye = MV * v
 v_clip = P * v_eye = P * (MV * v) = P * MV * v

после этого применяется клип к NDC-преобразованию.

 [x,y,depth] = clip_to_NDC( v_clip ) = clip_to_NDC(P * MV * v)

То, что делает gluUnProject, - это обращение только вышеприведенного выражения:

 gluUnProject(MV, P, x, y, depth):

 v_clip = clip_to_NDC^-1([x,y,depth])
 v = MV^-1 * P^-1 * v_clip = MV^-1 * P^-1 * clip_to_NDC^-1([x,y,depth])

Или другими словами, учитывая вид модели и матрицу проекции, gluUnProject будет проецироваться обратно из пространства экрана в пространство, преобразованное там цепочкой преобразования.

Также помогает помнить, что OpenGL не является графом сцены, то есть он не отслеживает все преобразования, нарисованные вами объекты и т. Д. Он «живет мгновением», если вы хотите так сказать.

...