Как единица координаты объекта соотносится с единицей объема отсечения?

#opengl

#opengl

Вопрос:

Поскольку данные вершины будут преобразованы с помощью матрицы проекции для получения координат отсечения. Интересно, совпадают ли эти две единицы измерения?
Например, если у меня есть точка P (20, 20, 20), и мой объем отсечения определяется следующим образом:

 gluPerspective( 45.0,                      //The camera angle
                ( double )w / ( double )h, //The width-to-height ratio
                2.0,                       //The near z clipping coordinate
                2000.0 );                  //The far z clipping coordinate
  

Если я рассматриваю 20 как дюймы, тогда 2.0 и 2000.0 также должны быть в дюймах? Связаны ли они друг с другом или они полностью независимы?

Спасибо,

Ответ №1:

Здесь вы можете найти раздел часто задаваемых технических вопросов OpenGL «Преобразования» полезным.

Вы выбрали дюймы в качестве базовой единицы измерения «Мировых координат». Вы заметите, что в FAQ определены «Координаты объекта», «Координаты глаза» и «Координаты клипа».

Преобразования находятся между ними — матрица ModelView преобразуется из объекта в глаз, матрица проекции из глаза в клип и т.д.

Полезно представить это как ряд черных ящиков (матриц проекции), принимающих различные системы координат, немного перемещающих / масштабирующих / сдвигающих их и выдающих новую.

Теперь вы можете концептуально разделить черный ящик матрицы ModelView на две: матрицы «Модель» и «Вид». songho.ca В руководствах OpenGL есть страница преобразования, которая показывает это.

Итак, вы можете посмотреть на:

 Object coords -> (ModelView matrix) -> Eye coords -> ...
  

… как эквивалент:

 Object coords -> (Model matrix) -> World coords -> (View matrix) -> Eye coords -> ...
  

Это дает вам «Мировые координаты» между этими двумя блоками.

Обратите внимание, что ваши «Координаты объекта» и «Мировые координаты» часто могут иметь одинаковые единицы измерения, но разное происхождение.

Они также могут иметь немного разные единицы измерения. Например, вам может быть удобно определить символьный объект стандартной высоты и просто изменить масштабирование координат в связанной матрице модели, чтобы сделать символьный объект более высоким или объемным. 1 единица высоты объекта может масштабироваться до 1,2 единицы мировой высоты.

(Обратите внимание, что вы можете разделить это еще больше, используя «Arm matrix» для перевода из «пространства рук» в «Пространство туловища» и «Torso matrix» для перехода оттуда в «Пространство объектов» и т.д.)

Довольно типично, чтобы камеры были только расположены и нацелены — то есть переведены и повернуты. Если это так, «Мировое пространство» и «Пространство глаза» также будут разделять единицы измерения.


Благодаря этому обходному процессу мы теперь видим, что наше «Мировое пространство» и «Пространство для глаз», а также, вероятно, многие из наших «Пространств объектов», находятся в выбранной вами единице измерения : дюймах.

gluPerspective всегда указывает ближнюю и дальнюю плоскости в терминах «расстояния от зрителя» (иначе расстояние от глаза) — см. его страницу руководства.

Подразумевается, что расстояние находится в пространстве координат глаза; мы знаем, что матрица, которую они показывают, преобразуется из пространства глаз в пространство клипа, и на основе того, как построена матрица, ясно, что zNear и zFar и т.д. Будут в единицах пространства глаз.


Взаимосвязь между zNear и zFar важна для разделения перспективы. Это приводит, среди прочего, к большей точности глубины в передней части объема просмотра.

Они также, конечно, определяют ближайшие и наиболее удаленные объекты, которые вы будете визуализировать.

Если вы посмотрите на вышеупомянутую страницу руководства о том, как строится матрица проекции, и вы немного знаете о поведении чисел с плавающей запятой IEEE-754, вы можете экстраполировать некоторое интересное поведение, если вы установите свой zNear слишком близко, или ваш zFar либо слишком далеко, либо со слишком большим значением, кратным zNear, и т.д.

(Кстати, я бы настоятельно рекомендовал книгу Essential Math for Games and Interactive Applications здесь. Кроме того, если вы хотите немного поразмышлять, есть небольшая забавная презентация GDC2007 под названием «Трюки с матрицей проекции» (pdf).)

Ответ №2:

Да, они связаны, оба имеют одинаковое расстояние, но (20,20,20) — это расстояние от центральной точки мира, в то время как значения в gluPerspective относятся к расстоянию от камеры. пожалуйста, дайте мне «нет», если я не понял ваш вопрос.

Комментарии:

1. @I Phantasm Я: Большое спасибо. Итак, (дальний — ближний) задают всю длину объема отсечения, и чтобы быть в этом объеме отсечения, координата z точки P должна находиться между ближним и дальним?

2. да. но объем отсечения зависит от того, в каком направлении обращена «камера» и где она расположена.

3. Спасибо. Теперь я вроде как понимаю это.