Вы можете найти полезный раздел Технических вопросов и ответов по OpenGL здесь.
Вы выбрали дюймы в качестве базовой единицы "World Coordinate". Вы заметите, что часто задаваемые вопросы определяют «Координаты объекта», «Координаты глаза» и «Координаты клипа».
Преобразования располагаются между ними - матрица ModelView преобразуется из объекта в глаз, матрица проекции из глаза в клип и т. Д.
Полезно думать об этом как о количестве черных ящиков (матриц проекции), принимающих в различных системах координат, перемещая / масштабируя / сдвигая их немного и выплевывая новый.
Теперь вы можете концептуально разбить черный ящик матрицы ModelView на две части: матрицы «Модель» и «Вид». У songho.ca OpenGL Tutorials есть страница преобразования , которая показывает это.
Итак, вы можете посмотреть на:
Object coords -> (ModelView matrix) -> Eye coords -> ...
... как эквивалент:
Object coords -> (Model matrix) -> World coords -> (View matrix) -> Eye coords -> ...
Это дает вам "Мировые координаты" между этими двумя полями.
Обратите внимание, что ваши "Объектные координаты" и "Мировые координаты" часто могут иметь одинаковые единицы, но различное происхождение.
У них также могут быть немного другие юниты. Например, вам может быть удобно определить символьный объект стандартной высоты и просто изменить масштабирование координат в соответствующей матрице модели, чтобы сделать более высокий или объемный символьный объект. 1 единица высоты объекта может масштабироваться до 1,2 единиц мировой высоты.
(Обратите внимание, что вы можете подразделить это еще больше, имея «Матрицу рук» для перевода из «Пространства рук» в «Пространство торса» и «Матрицу торса» для перехода в «Пространство объектов» и т. Д.)
Довольно типично, когда камеры располагаются и нацеливаются - то есть переводятся и поворачиваются. Если это так, то «Мировое пространство» и «Глазное пространство» также будут иметь общие единицы.
Посредством этого обходного процесса мы теперь видим, что наше "Мировое пространство" и наше "Пространство Глаза", а также, вероятно, многие из наших "Пространств-объектов", находятся в выбранной вами единице: дюймы.
gluPerspective
всегда определяет ближнюю и дальнюю плоскости в терминах «расстояние от зрителя» (то есть расстояние от глаза) - см. его справочную страницу .
Подразумевается, что расстояние находится в координатном пространстве глаза; мы знаем, что матрица, которую они показывают, трансформируется из пространства глаза в пространство клипа, и исходя из того, как построена матрица, ясно, что zNear, zFar и т. д. будут в единицах пространства глаза.
Отношения между zNear
и zFar
важны для деления перспективы. Это приводит, помимо прочего, к большей точности глубины в передней части тома обзора .
Они также, конечно, определяют ближайшие и самые отдаленные вещи, которые вы будете визуализировать.
Если вы посмотрите на вышеупомянутую страницу руководства о том, как строится матрица проекции, и вы немного знакомы с поведением чисел с плавающей запятой IEEE-754, вы можете экстраполировать интересное поведение, если вы устанавливаете свой zNear слишком близко, или ваш zFar слишком большой или слишком большой, кратный zNear и т. д.
(Кстати, я очень рекомендую здесь книгу Essential Math для игр и интерактивных приложений *1055*. Кроме того, если вы хотите, чтобы ваш ум немного взорвался, есть небольшая забавная презентация GDC2007 под названием "Проекции матрицы проекций" (pdf) .)