Перспектива матрицы в графической API или дьявол кроется в деталях

Перспектива матрицы в графической API или дьявол кроется в деталях

608

Время от времени ответ отыскать чрезвычайно трудно и, как это традиционно бывает , большая часть разрабов опускает ее на полпути. В какой-то момент каждый Разраб в области компьютерной графики, возникает вопросец: как эти многообещающие матрицы?
Давайте выясним совместно! Это не решение трудности!
Некие факты из спецификации OpenGL: Мы проведем декомпозицию сложной задачки и выделить главные моменты. Непревзойденно, вот что нам необходимо. Давайте будем реалистами с практическим уклоном и взять в качестве тест OpenGL версии 3.3. Начиная с данной версии, каждый застройщик должен воплотить модуль матричных операций.

Матрица хранится по столбцам (строчкам);
Однородные координаты;
Канонический размер отсечения (СVV) в леворуких системе координат.
В Шейдерной программы матрицы должны быть переданы как, и в Шейдере, чтоб не выполнить умножение вектора на матрицу и матрицы на вектор. Существует два метода хранения матриц: главных столбцов и строк-майор. По большому счету, представление матриц в памяти значения не имеет, поэтому что матрица постоянно можно перевести в 1-го вида в иной методом обычный перестановки. А раз нет различия, для всех дальнейших расчетах мы будем применять классические главных столбцов матрицы. При программировании на OpenGL, есть маленькая хитрость, которая дозволяет Для вас отрешиться от транспонирование матрицы при сохранении классической колонны-главные населенные пункты. Лекции по линейной алгебре просто применять схему главных столбцов.
Иными словами:
в Декартовых координатах Однородные координаты не чрезвычайно хитрецкая система с рядом обычных правил для перевода обыденных Декартовых координат в однородных координат и обратно. Для преобразования Декартовых координат в однородных координатах, необходимо по x, по Y и по Z умножить на хоть какое вещественное число Вт (не считая 0). Однородных координат является строчка матрицы размерностью [1х4]. Дальше нужно записать итог в первых 3-х компонентов, и крайний компонент равен мультипликатор Вт.
Вт — вещественное число, не равное 0
однородные координаты
То есть, чтоб получить матрицу-строчку: Малая хитрость: раз Вт равен одному, то все, что нужно для перевода является передача компонентов х, по Y и по Z , и назначить единица в крайнем компоненте.

В Декартовой системе координат такое разделение нереально. Несколько слов о как ноль Вт. точки, где (х, у, Z) — Декартовы координаты
— вектор, где (х, у, Z)- радиус-вектор С точки зрения однородных координат полностью приемлемо. Однородные координаты разрешают нам различать меж точками и векторами.
Иными словами:
однородные координаты
— в Декартовых координатах Все элементы строк матрицы делится на крайний компонент. Обратный перевод вершин от однородных координат к Декартовой системе координат последующим образом.
Переход от однородных координат к Декартовой системе координат реализуется аппаратно. Основное, что вы должны знать, что все методы OpenGL методом отсечения и растеризации работают в Декартовых координатах, но до этого все преобразования выполняются в однородных координатах.
Самое основное, что необходимо знать систему координат СVV осталось! Как видно из Рис. Канонический размер отсечения либо размер канонический вид (СVV) является одним из немногих задокументированных частей для OpenGL. Все, что попадает в область СVV тему растеризации, все, что находится за пределами cvv-код игнорируется. 1 СVV-ось-выровнены куб с центром в начале координат и длиной ребра, равной двойка. Все, что находится отчасти вне границ СVV, при условии отсечения алгоритмов.

Канонический размер отсечения на OpenGL (СVV) 1. Рис.
Давайте выясним. Как же так, ведь в спецификации к OpenGL 1.0, там верно написано, что употребляется система координат является правой рукою? Левша системе координат?

Рис. Система координат 2.
Есть два логичный вопросец. Раз размер видимости, она представляет собой куб с длиной ребра, равной двум, тогда почему сцена в размере пары тыщ условных единиц видны на экране? Как упоминалось ранее, программер реализует модуль матричных операций. Но в системе координат cvv и пользовательская система координат-это две совсем различные вещи. Как видно из Рис. Матрица проекции-это организация, которая занимается решением этих вопросцев. В OpenGL 1.0 практически употребляется правосторонней системе координат юзера. Не считая того, начиная с версии 3.3 нет уже такового понятия, как обычная система координат в OpenGL. На каком шаге находится перевод пользовательской системы координат в систему координат cvv-код. 2 системы координат различаются лишь в направлении оси Z будет. Формирование матриц вращения, формирования проекционных матриц, нахождение обратной матрицы, умножение матриц малый набор операций, входящих в модуль матричных операций.
Факты о OpenGL закончена и настало время, чтоб довести все совместно. Основная мысль выше, Разраб свободен выбрать тип юзера системы координат и должны верно обрисовать матрицу проекции.
В целях определения трехмерных координат вершин двумерного монитора нужно: Ни для кого не секрет, что неважно какая трехмерная модель состоит из конечного перечня вершин, которые матричных преобразований совсем независимо друг от друга. Так как она связана с cvv и пользовательские системы координат? Для того чтоб осознать, почему объекты миниатюризируется с повышением расстояния, разглядим матрицу преобразования трехмерной модели шаг за шагом. Один из самых всераспространенных и тяжело достичь матрица представляет собой матрицу многообещающего преобразования. Почему объекты с повышением расстояния до наблюдающего стать меньше?

Преобразование Декартовых координат в однородных координатах;
Умножение однородных координат в модели матрицы;
Итог умножить на матрицу вида;
Приобретенный итог умножить на матрицу проекции;
В итоге перехода от однородных координат к Декартовой системе координат.
Геометрический смысл модели матрица перевести модель из локальной системы координат к глобальной системе координат. Из места модели координаты будут храниться в мировом пространстве (от локального до глобального). Выражаясь наиболее просто, загруженных из файла, трехмерный объект в пространстве модели, где координаты относительно объекта. Чтоб сделать это, используйте модель матрицы. Дальше, используя модель матрицы позиционирования, масштабирования и вращения модели. Модель места в мировое место является локальным. Либо, как молвят, довести вершин из места модели в место мира. В итоге всех вершин трехмерной модели получить актуальные однородных координат в трехмерной сцены. Перевод Декартовых координат в однородных координат дискуссировалось ранее.
Как получить эту обратную матрицу? Раз верх был посторонним наблюдателем, значение ее однородные координаты по Z в видовом пространстве, непременно, будет отрицательным числом. Модель матрицы наблюдающего требуется прямой матрицы. Видовое место является локальным по отношению ко всему миру место, так что координаты нужно сделать (и не сделать, как в прошлом случае). Ровная матрица преобразования координат места. Investirovav данной матрицы, получим матрицу вида. Напротив, чтоб сделать их, необходимо, чтоб инвертировать матрицу преобразования, таковым образом, видовой трансформации обрисовывает обратную матрицу. Сейчас перейдите к шагу три. Во многом он припоминает смысле модели матрицы. По большому счету так оно и есть. Соответственно, раз наблюдающий увидел определенные вершины, тогда значение однородные координаты Z для этого пика в видовом пространстве, непременно, будет положительным числом. Тут начинается вида места. Но для наблюдающего масштабирование операция бессмысленна, так меж моделью матрицы наблюдающего и модель матрицы трехмерного объекта не может быть приравнена. Каковы индивидуальности наблюдающего? Для начала сделайте прямой матрицы наблюдающего. В этом пространстве координат на базе положения и ориентации наблюдающего, как как будто он был центром мира. Наблюдающий описывается координат, в которой он находится, и направление вектора обзора. Наблюдающий постоянно глядит в направлении локальной оси Z на. На практике это значит, что все вершины в мировой однородных координат получат новейшие однородных координат относительно наблюдающего. Наблюдающий может двигаться по сцене и делать повороты.
4-ый шаг однородных координат вида удаляются из места в место СVV. Еще раз подчеркивает тот факт, что все потенциально видимых вершин будет положительным однородных координат по Z. Шаг 4-ый-самый увлекательный шаг. Прошлые шаги были тщательно обсуждены намеренно, чтоб читатель иметь полную картину всех операндов 4-ого шага.
Разглядим матрицу вида:

И точки в однородном пространстве наблюдающего:

Делать умножение однородных координат на матрицу:

Перевести приобретенное однородных координат в Декартовы координаты:

Вот разъяснение эффекта перспективы. Другими словами один из пт-это другое. Представим, что есть две точки в пространстве видов с схожими координатами х и по Y, но различные координаты по Z. Чем больше значение Z в (чем далее точка находится от наблюдающего), тем больше сжатие. Вправду, формула указывает, что вследствие разделения по координате Z с, сжимается в точку происхождения. Из-за многообещающих искажений, наблюдающий должен созидать обе точки.
В спецификации OpenGL говорит, что операции на отсечение и растеризации выполняются в Декартовых координатах, и процесс преобразования однородных координат в Декартовой системе координат выполняется автоматом.
Вытекают многообещающие матрицы для левостороннего пользовательской системы координат. Как упоминалось ранее, матрица проекции 2-ух вещей: набор пользовательской системы координат (слева либо справа), передача громкости зрения наблюдающего в СVV. Матрица (1) является матрицей для матрицы многообещающей проекции.
3): Матрица проекции может быть описано с помощью 4 характеристик (Рис.

Угол в радианах (fovy);
Соотношение сторон (нюанс);
Расстояние до ближней плоскости отсечения (н);
Расстояние до дальней плоскости отсечения (Ф).

Многообещающий размер видимость Рис. 3.
Разглядим проекцию точки в пространстве наблюдающего на лицевой стороне накладка многообещающих сумму видимость. 4 изображает вид сбоку. Для большей ясности на фиг. Следует также отметить, что пользовательская система координат совпадает с началом системы координат код cvv, то есть левосторонняя система координат.

4. Проекция случайной точки Рис.
Основанный на свойствах схожих треугольников справедливым последующее равенство:

Экспресс yꞌ и xꞌ:

Другими словами Вы желаете сохранить значение компонентов по Z. Но, для соответствующего экранирования трехмерных объектов нужно знать глубину каждого фрагмента. 3 указывает, что значение zꞌ не подступает, так как глубина фрагмент, поэтому что все проекции точек могут иметь однообразное значение zꞌ. Выходом из данной ситуации является внедрение так именуемых pseudopuberty. В принципе, выражение (2) является достаточным для получения координат проекции. Рис. Это значение употребляется, когда глубина испытания с OpenGL.
Характеристики pseudopuberty:
Pseudoplusia рассчитывается на базе значения по Z;
Чем поближе к наблюдающему смысл, тем наименее принципиально pseudoplusia;
Все точки, лежащие на передней плоскости в размер видимости, значение pseudopuberty -1;
Все точки, лежащие на дальней плоскости отсечения размера видимости, значение pseudopuberty равным 1;
Все фрагменты, лежащие в размер видимости, имеют значение pseudopuberty в спектре [-1 1].
Давайте выведем формулу, по которой будет рассчитываться pseudoplusia. За базу возьмем последующее выражение:

Коэффициенты А И Б должны быть рассчитаны. Для того чтоб сделать это, мы будем применять характеристики pseudopuberty 3 и 4. Получаем систему из 2-ух уравнений с 2-мя неизвестными:

Произведет сумма обеих частей системы и итог умножить на произведение НФ, С Ф И Н не может быть нулевой. Получил:

Откройте скобки и baregreppro составляющие, так что осталось лишь расстаться с Как, а направо лишь с б:

Подставим (6) в (5). Преобразовать выражение к обычный дроби:

Умножьте обе стороны по -2fn, С Ф И Н не может быть нулевой. Вот похожие, baregreppro составляющие и Экспресс — б:

Подставляем (7) в (6) и оставьте на:

Соответственно, составляющие А И Б равен:

Замена заключается в последующем: Сейчас мы подставим приобретенные коэффициенты в матрице заготовки (1) и понаблюдайте, что произойдет с координатой Z и для случайной точки в однородном пространстве наблюдающего.

2
2
Точка находится на передней грани отсечения размера видимости. 3
5
Раз точка размещена меж передней торцевой части обрезать и на Далекий край отсечения размера видимости. Это растеризации. Это растеризации. Пусть расстояние до ближней плоскости отсечения н равно 2, а расстояние до дальней плоскости отсечения Ф составляет 10. 5
20
Сущность заключается в далекий край отсечения размера видимости. Разглядим 5 точек в однородном пространстве наблюдающего:

Относительное положение точки и количество видимость

Росы
Значение
Описание

1
1
Точка находится перед передней плоскости отсечения размера видимости. Это растеризации. Не пройти растрирования. 4
10
Сущность в том, на дальней грани отсечения размера видимости. Не пройти растрирования.
Умножьте все точки на матрице (8), а потом перевести приобретенное однородных координат в Декартовы координаты. Для этого нам необходимо вычислить значения новейших унифицированных компонент и .

Пункт 1:

Пункт 2:

Пункт 3:

Пункт 4:

Пункт 5:

Отметим, что однородная координата полностью позиционируемые код cvv, и самое основное, сейчас есть возможность проверить глубину с OpenGL, поэтому что pseudoplusia на сто процентов соответствует требованиям тестов.
С координатой Z и разобрались, идем на координаты х и по Y. Кромка длина кода равна двум. Соответственно, высота и ширина потенциального размера видимости нужно сжать до 2-ух условных единиц. Как упоминалось ранее, весь многообещающих сумму видимость обязана помещаться в СVV.

Давайте выразим высоту и ширину, используя эти значения. У нас угловая fovy и значение нюанс.

5. Сумма видимость Рис.
5 указывает, что: Из Рис.

Сейчас вы сможете получить окончательный вид матрицы многообещающей проекции для пользовательского левша систем координат, которые работают с СVV на OpenGL:

На выходе матрицы завершена.
Что касается системы координат СVV, совместимая с DirectX и OpenGL, употребляет левостороннюю систему координат. В DirectX СVV-это прямоугольный параллелепипед с длиной по осям х и Y не равен диаде оси Z от длины, равная одной. Несколько слов о DirectX — основной соперник в OpenGL. Спектр х и Y не равен [-1 1], а спектр по Z равен [0 1]. Совместимая с DirectX различается от технологии OpenGL лишь размеры cvv и его размещение.
Для матриц с DirectX характеристики 3 и 4 меняются в согласовании спектре [0 1]. 2, Рис.3 и фиг.4 чтоб отразить новейшие направления оси Z на. Для вывода многообещающих матриц для юзера правостороннюю систему координат нужно перерисовать на фиг. Дальнейшие расчеты ведутся аналогично, с точностью до знака.
На эту тему многообещающих матриц можно считать закрытым.
Сигал М., К. Lanterman А. в CS 543 — Компьютерная графика: Проецирование
5. Игнатенко А. Нужная литература
1. Учебник 12 — Многообещающая Проекция
9. Графический конвейер
2. Эйкели, На OpenGL Графическая Система: Спецификация (Версия 3.3 (Базисный Профиль) — 11 Марта 2010)
6. В OpenGL Матрица Проекции
7. А. и Многоядерный Графический процессор программирования для консолей
4. У. В Шейдерный Язык OpenGL В Версии 3.30
8. Линдеман, р. однородных координат
10. Однородные координаты
3. Перспективное преобразование habrahabr.ru Песня Х.