Подтвердить что ты не робот

Что такое координаты пространства глаз?

Поскольку я изучаю OpenGL, я часто натыкаюсь на так называемые координаты пространства глаз.

Если я прав, у вас обычно есть три матрицы. Модельная матрица, матрица представлений и матрица проекций. Хотя я не совсем уверен, как работает математика, я знаю, что конвертирует координаты в мировое пространство, просматривает пространство и пространство экрана.

Но где пространство глаз и какие матрицы мне нужно преобразовать в глазное пространство?

4b9b3361

Ответ 1

Возможно, следующая иллюстрация, показывающая взаимосвязь между различными пространствами, поможет: The OpenGL transformation pipeline

В зависимости от того, используете ли вы конвейер с фиксированной функцией (вы, например, вы вызываете glMatrixMode()) или используете шейдеры, операции идентичны - это просто вопрос о том, закодируете ли вы их непосредственно в шейдере, или конвейер OpenGL помогает в вашей работе.

Несмотря на отвращение к обсуждению вещей в терминах конвейера с фиксированной функцией, это делает разговор более простым, поэтому я начну там.

В устаревшем OpenGL (т.е. версии до OpenGL 3.1 или с использованием профилей совместимости) определены два матричных стека: model-view и projection, а при запуске приложения матрица в верхней части каждого стека - это идентификационная матрица (1.0 по диагонали, 0.0 для всех остальных элементов). Если вы рисуете координаты в этом пространстве, вы эффективно выполняете рендеринг в нормализованных координатах устройства (NDC), который захватывает любые вершины за пределами диапазона [-1,1] как в X, Y, так и в Z. Преобразование вида (как set путем вызова glViewport()) - это то, что отображает NDC в координаты окна (ну, координаты просмотра, действительно, но чаще всего окно просмотра и окно имеют одинаковый размер и местоположение), а значение глубины в диапазоне глубины (которое равно [ 0,1] по умолчанию).

Теперь в большинстве приложений первое преобразование, которое указано, представляет собой проекционное преобразование, которое представлено в двух вариантах: орфографических и перспективных проекциях. Ортографическая проекция сохраняет углы и обычно используется в научных и технических приложениях, поскольку она не искажает относительные длины сегментов линии. В устаревшем OpenGL орфографические проекции задаются либо glOrtho, либо gluOrtho2D. Чаще всего используются перспективные преобразования, которые имитируют работу глаз (т.е. Объекты, находящиеся далеко от глаз, меньше близких) и определяются либо glFrustum, либо gluPerspective. Для перспективных проекций они определяли смотровое усечение, которое представляет собой усеченную пирамиду, закрепленную в месте расположения глаз, которые указаны в координатах глаз. В координатах глаз "глаз" расположен в начале координат и смотрит вниз по оси -Z. Ваши ближние и дальние плоскости отсечения указаны как расстояния вдоль оси -Z. Если вы визуализируете координаты глаз, любая геометрия, заданная между плоскостями ближнего и дальнего отсечения, и внутренняя часть смотрового усечения не будет отбракована и будет преобразована, чтобы появиться в окне просмотра. Здесь представлена ​​диаграмма перспективной проекции и ее связь с плоскостью изображения Viewing frustum.

Глаз расположен на вершине смотрового усечения.

Последнее преобразование, которое следует обсудить, - это преобразование модели-представления, которое отвечает за перемещение систем координат (а не объектов, больше на то, что в какой-то момент), так что они хорошо расположены относительно глаза и смотрового усечения. Общие трансформации моделирования - это переводы, шкалы, вращения и ножницы (из которых в OpenGL нет встроенной поддержки).

Вообще говоря, 3D-модели моделируются вокруг локальной системы координат (например, задавая координаты сферы с центром в центре). Моделирующие преобразования используются для перемещения "текущей" системы координат в новое место, так что, когда вы визуализируете локально-смоделированный объект, он позиционируется в нужном месте.

Там нет математической разницы между преобразованием моделирования и преобразованием просмотра. Как правило, моделирование преобразований используется для конкретных моделей и контролируется операциями glPushMatrix() и glPopMatrix(), которые сначала указываются при преобразовании просмотра и влияют на все последующие операции моделирования.

Теперь, если вы делаете этот современный OpenGL (основной профиль версии 3.1 и вперед), вы должны выполнять все эти операции логически самостоятельно (вы можете указать только одно преобразование, складывающее преобразования модели и проекции в одно матрица умножается). Матрицы обычно задаются как шейдер uniforms. Нет матричных стеков, разделения преобразований модели и проекции, и вам нужно правильно вычислить математику для эмуляции конвейера. (BTW, шаги преобразования разделов перспективы и видового экрана выполняются OpenGL после завершения вашего вершинного шейдера - вам не нужно делать математику [вы можете, это ничего не повредит, если вы не установите w до 1.0 в вашем вершинном шейдерном выводе gl_Position).

Ответ 2

Пространство глаз, пространство просмотра и пространство камеры - все синонимы для одного и того же: мир относительно камеры.