Представление модели - это не (конкретная) система координат, а преобразование из локального пространства объекта (модель-) в пространство глаза (-вид).
На картинке выше мы видим пространство объекта (штатив "в" чайнике) и мировое пространство (большой штатив). Но есть и глазное пространство, для которого не требуется штатив, хотя мы можем представить его достаточно легко: одна вертикальная ось вверх и одна горизонтальная ось прямо посередине и ось, торчащая из картинки.
То, что мы не «видим», - это проекция, то есть преобразование, которое проецирует изображение на экран (технически обрезает пространство, затем оттуда в 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 не является графом сцены, то есть он не отслеживает все преобразования, нарисованные вами объекты и т. Д. Он «живет мгновением», если вы хотите так сказать.