#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. Спасибо. Теперь я вроде как понимаю это.