Биографии Характеристики Анализ

Центральные (перспективные) проекции. Перспективные матрицы в графическом API или дьявол прячется в деталях

Предложенные в предыдущем разделе виды перспективной проекции были неинформативны, так как во всех случаях из каждого центра проекции была видна только одна грань куба. Для того чтобы наблюдатель воспринял трехмерную форму объекта на основании только одного вида, надо, чтобы были видны несколько граней этого объекта. Для простых объектов, подобных кубу, должны быть видны как минимум три грани. Вид с несколькими гранями можно получить из одноточечной перспективной проекции с фиксированным центром и с плоскостью проецирования, перпендикулярной направлению взгляда, если предварительно выполнен перенос и/или поворот объекта. Тогда получается реалистический вид, если только центр проекции не находится слишком близко к объекту.

Рис. 3-31 Трехточечная перспектива, (а) Исходный куб; (b) перспективная проекция на плоскость ; (с) искаженный куб.

Для начала рассмотрим простой перенос объекта с последующим одноточечным проецированием на плоскость и с центром проекции в точке . Требуемое преобразование записывается в виде

, (3-59)

Рис. 3-32 Одноточечная перспективная проекция с переносом в , направлениях.

Уравнение (3-59) вместе с рис. 3-32 показывает, что перенос в направлениях и открывает дополнительные грани объекта. Перенос в обоих этих направлениях необходим, чтобы открыть три грани простого кубообразного объекта. На рис. 3-32 показаны результаты переноса вдоль прямой отцентрированного относительно начала координат куба и одноточечного проецирования на плоскость . Заметим, что для передней грани показываются истинные размер и форма.

Уравнение (3-59) также показывает, что перенос вдоль оси , т.е. к центру проекции или от него, приводит к явному изменению масштаба (из-за элемента ). Этот эффект соответствует физической реальности, так как объекты, находящиеся дальше от наблюдателя, выглядят более мелкими. Заметим, что при приближении центра проекции к бесконечности явление масштабирования исчезает. Этот эффект схематично показан на рис. 3-33. Как изображено на этом рисунке, объект может находиться с любой стороны от центра проекции. Если объект и плоскость проекции находятся по одну сторону от центра, то, как показано на рис. 3-33, получается прямое изображение. Если же объект и плоскость проекции лежат по разные стороны от центра, то получается перевернутое изображение.

Рис. 3-33 Эффект масштабирования при перемещениях вдоль оси для одноточечной перспективной проекции.

На рис. 3-34 показаны результаты перемещения объекта во всех трех направлениях. Здесь куб перемещается вдоль трехмерной прямой от к . Заметно очевидное увеличение размера, а также на всех видах заметно сохранение истинной формы, но не размера передней грани.

Эти идеи более подробно изложены в примере.

Пример 3-22 Одноточечная перспективная проекция с переносом

Рассмотрим отцентрированный относительно начала координат единичный куб со следующими координатными векторами

.

Переместим куб на 5 единиц в направлениях и и построим перспективную проекцию на плоскость с центром проекции в .

Из уравнения (3-59) получаем общую матрицу преобразования

.

Рис. 3-34 Одноточечная перспективная проекция, объединенная с переносами в , , направлениях.

Преобразованные координаты

.

Правый верхний объект на рис. 3-32 изображает этот результат.

Если исходный объект был перемещен на 5 единиц в направлениях , , и была построена одноточечная перспективная проекция на плоскость с центром проекции в , тогда из (3-59) следует, что общая матрица преобразования записывается в виде

.

Отметим общее масштабирование, задаваемое значением 0.75 в правом нижнем элементе матрицы преобразования.

Преобразованные координаты равны

.

Результат показан в виде верхнего правого объекта на рис. 3-34.

Несколько граней также будет видно, если использовать вращение объекта. Один поворот откроет по крайней мере две грани объекта, тогда как два и более поворотов вокруг разных осей откроют, как минимум, три грани.

Матрица преобразования для поворота вокруг оси на угол и последующего одноточечного перспективного проецирования на плоскость с центром проекции в :

. (3-60)

Аналогичным образом матрица преобразования для поворота вокруг оси на угол и последующего одноточечного перспективного проецирования на плоскость с центром проекции в точке имеет вид:

. (3-61)

В обоих уравнениях (3-60) и (3-61) не равны нулю два отвечающих за перспективное преобразование (перспективных) элемента в четвертом столбце матрицы преобразования. Таким образом, один поворот вокруг главной оси, перпендикулярной той оси, на которой лежит центр проекции, эквивалентен двуточечному перспективному преобразованию. При повороте вокруг оси, на которой лежит центр проекции, такого эффекта нет. Заметим, что для одного поворота перспективный элемент для оси вращения остается неизменным, например, в уравнениях (3-60) и (3-61) элементы и соответственно равны нулю.

В общем случае вращение вокруг главной оси не открывает необходимого для адекватного трехмерного представления числа граней - как минимум, трех. Для этого оно должно быть скомбинировано с перемещением вдоль оси. Следующий пример иллюстрирует это.

Пример 3-23 Двуточечное перспективное проецирование с использованием поворота вокруг одной главной оси

Рассмотрим проекцию на плоскость с центром в точке куба с рис. 3-35а, повернутого вокруг оси на угол , чтобы открылась левая грань, и перемещенного на единицы вдоль , чтобы открылась верхняя грань.

Используя уравнение (3-38) с , уравнение (3-47) с и уравнение (3-14) с , получим

.

Преобразованные координаты равны

.

Результат показан на рис. 3-35b. Искажение появляется из-за того, что центр проекции расположен слишком близко к кубу. Отметим схождение параллельных осям и прямых линий к точкам схода, лежащим на оси . Эти точки схода определяются в примере 3-25 из разд. 3-17.

Рис. 3-35 Двуточечная перспективная проекция с поворотом вокруг одной оси.

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

.

Результат изображен на рис. 3-36.

Рис. 3-36 Трехточечная перспективная проекция с поворотом вокруг двух осей.

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

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

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

Перспективная проекция

Модель перспективной проекции соответствует идеальной камере-обскуре. Эта модель довольно точно соответствует процессу построения изображения в большинстве современных фото- и видеокамер. Однако из-за ограничений современной оптики реальный процесс несколько отличается от модели камеры-обскуры. Отличия реального процесса от модели называются искажениями и моделируются отдельно.

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

Простейшая модель перспективной проекции

Рассмотрим простейший случай, когда центр проекции камеры (фокус) помещен в начало системы координат, и плоскость изображения совпадает с плоскостью Z=1. Пусть (X,Y,Z) - координаты точки в 3-х мерном пространстве, а (x,y) - проекция этой точки на изображение I. Перспективная проекция в этом случае описывается следующими уравнениями:

В матричной форме с использованием однородных координат эти уравнения переписываются в следующем виде:

(2.2)

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

Внутренняя калибровка камеры

Простейший случай перспективной проекции практически всегда не соответствует реальной камере. Расстояние от центра проекции до плоскости изображения, т.е. фокусное расстояние, обозначаемое f, обычно не равно 1. Также координаты точки в плоскости изображения могут не совпадать с абсолютными координатами. При использовании цифровой камеры, соотношение между координатами точки в изображении и абсолютными координатами точки на идеальной плоскости, определяется формой и размерами пикселов матрицы.

Обозначим размеры пиксела матрицы цифровой камеры за p x , p y , угол наклона пиксела за α, а принципиальную точку за , рис.2. Тогда координаты точки (x,y) в изображении, соответствующей точке (x R , y R) на идеальной плоскости, определяются выражением:

(2.3)

Если за f x ,f y обозначить фокусное расстояние f, измеренное в ширинах и высотах пикселей, а tan(α)*f/p y обозначить как s, то формула 2.3 преобразуется в:

(2.4)

Матрица K называется матрицей внутренней калибровки камеры. В большинстве случаев у реальных цифровых камер угол наклона пикселей близок к прямому, т.е. параметр s=0, а ширина и высота пикселя равны. Принципиальная точка обычно располагается в центре изображения. Поэтому матрица K может быть записана в виде:

(2.5)

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

Внешняя калибровка камеры

Пусть M - точка сцены в 3-х мерном пространстве. Любое движение является евклидовым преобразованием пространства, поэтому в однородных координатах оно выражается как:

(2.6)

где R - матрица вращения, T= T - вектор переноса.

Движение камеры относительно сцены эквивалентно обратному движению точек сцены относительно камеры, поэтому равно:

(2.7)

где R, T - матрица вращения и вектор перемещения камеры относительно сцены. Матрица С называется матрицей внешней калибровки камеры. Матрица C -1 называется матрицей движения камеры . Таким образом, матрица внешней калибровки камеры переводит координаты точек сцены из системы координат сцены в систему координат, связанную с камерой.

Полная модель перспективной проекции

Из выражений 2.1, 2.4, 2.7 можно вывести выражение произвольной перспективной проекции для любой камеры с произвольной ориентацией и положением в пространстве:

В более краткой форме с учетом предыдущих обозначений эта формула может быть записана как:

Матрица P называется матрицей проекции камеры.

По аналогии с общим перспективным преобразованием рассмотрим вначале простейший случай перспективного преобразования плоскости. Пусть плоскость p совпадает с плоскостью Z=0, тогда однородные трехмерные координаты любой ее точки M=. Для любой камеры с матрицей проекции P, перспективное преобразование плоскости описывается матрицей размерности 3*3:


Поскольку любую плоскость в 3-х мерном пространстве можно перевести в плоскость Z = 0 евклидовым преобразованием поворота и переноса, что эквивалентно домножению матрицы камеры P на матрицу преобразования L, то перспективное отображение произвольной плоскости в пространстве описывается линейным преобразованием с матрицей размерности 3*3.

Перспективное преобразование плоскости также называется гомографией . В матричной форме перспективное преобразование плоскости записывается как m=HM .

Геометрия двух изображений

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

Перспективное преобразование плоскости

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

Если вся сцена или ее часть представляет собой плоскость, то ее изображения на разных видах с несовпадающими центрами камер, можно перевести друг в друга преобразованием гомографии. Пусть p - наблюдаемая плоскость, H 1 - преобразование гомографии между плоскостью p и изображением I 1 , H 2 - преобразование гомографии между плоскостью p и изображением I 2 . Тогда преобразование гомографии H 12 между изображениями I 1 и I 2 можно вывести следующим образом:

H 12 не зависит от параметризации плоскости p, а значит не зависит и от системы координаты в пространстве

Большинство методов определения координат 3х мерных точек по их проекциям и методов реконструкции 3-х мерной сцены, опираются на предположение о движении центра камеры между видами. Поэтому при совпадении центров камер нескольких видов эти методы будут давать некорректные результаты. Такие конфигурации камер должны обнаруживаться и обрабатываться специальным образом.

Поскольку преобразование гомографии записано в однородных координатах, то матрица H определена с точностью до масштаба. Она имеет 8 степеней свободы, и параметризируется 8 переменными. Каждое известная пара соответствующих точек m 1 и m 2 на первом и втором изображении соответственно дает 2 линейных уравнения от элементов матрицы H. Поэтому 4-х известных пар соответствующих точек достаточно для составления системы линейных уравнений из 8 уравнений с 8 неизвестными. По этой системе гомография H может быть однозначно определена, если никакие три из точек не лежат на одной прямой.

Фундаментальная матрица

Рассмотрим случай, когда центры камер двух видов не совпадают. Пусть C 1 и C 2 - центры двух камер, M - 3-х мерная точка сцены, m 1 и m 2 - проекции точки M на первое и второе изображение соответственно. Пусть П - плоскость, проходящая через точку M и центры камер C 1 и C 2 . Плоскость П пересекает плоскости изображений первого и второго видан по прямым l 1 и l 2 . Поскольку лучи C 1 M и C 2 M лежат в плоскости П, то очевидно, что точки m 1 и m 2 лежат на прямых l 1 и l 2 соответственно. Можно дать более общее утверждение, что проекции любой точки M", лежащей в плоскости П, на оба изображения должны лежать на прямых l 1 и l 2 . Эти прямые называются эпиполярными линиями. Плоскость П называются эпиполярной плоскостью.

Два вида одной и той же сцены называются стереопарой, а отрезок C 1 C 2 , соединяющий центры камер, называется базой стереопары (baseline) или стереобазой. Любая эпиполярная плоскость проходит через отрезок C 1 C 2 . Пусть C 1 C 2 пересекает первое и второе изображение в точках e 1 и e 2 соответственно. Точки e 1 и e 2 называются эпиполярными точками или эпиполями. Все эпиполярные линии пересекаются в точках e 1 и e 2 на первом и втором изображении соответственно. Множество эпиполярных плоскостей представляет собой пучок, пересекающийся по стереобазе C 1 C 2 . Множество эпиполярных линий на обоих изображений также представляют собой пучки прямых, пересекающихся в e 1 и e 2 .

Точки m 1 и m 2 называются соответствующими, если они являются проекциями одной и той же точки сцены M. Эпиполярные линии l 1 и l 2 называются соответствующими, если они лежат в одной и той же эпиполярной плоскости П. Если эпиполярная плоскость П проходит через точку m 1 , тогда эпиполярные линии l 1 и l 2 , лежащие в ней, называются соответствующими точке m 1 .

Ограничение на положение соответствующих точек m 1 и m 2 , вытекающей из эпиполярной геометрии, можно сформулировать следующим образом: точка m 2 , соответствующая m 1 , должна лежать на эпиполярной линии l 2 , соответствующей m 1 . Это условие называется эпиполярным ограничением. В однородных координатах условие того, что точка m лежит на линии l записывается как l T m=0 . Эпиполярная линия проходит также через эпиполярную точку. Уравнение прямой, проходящей через точки m 1 и e 1 можно записать как:

l 1 ∼ x m 1 ,

где x - антисимметричная матрица размерности 3*3 такая что, x m 1 - векторное произведение m 1 и e 1 .

Для соответствующих эпиполярные линий l 1 и l 2 верно:

где P + - псевдоинверсия матрицы P.

Матрица F называется фундаментальной матрицей. Она представляет собой линейный оператор, сопоставляющей каждой точке m 1 соответствующую ей эпиполярную линию l 2 . Для каждой пары соответствующих точек m 1 и m 2 верно

m T 2 Fm 1 =0

Это формулировка эпиполярного ограничения через фундаментальную матрицу.

Фундаментальная матрица имеет 7 степеней свободы. Каждая пара соответствующих точек m 1 и m 2 задает одно линейное уравнение на элементы матрицы, поэтому она может быть вычислена по известным 7 парам соответствующих точек.

Эпиполярное ограничение справедливо для любых пар соответствующих точек, расположенных на идеальных плоскостях двух видов. Если известны матрицы внутренней калибровки K 1 и K 2 камер обоих видов, то эпиполярное ограничение для соответствующих точек на идеальных плоскостях записывается как:

Матрица E называется существенной матрицей. Можно показать, что существенная матрица также может быть получена из взаимного расположения камер.

Пусть P 1 =(I|0) и P 2 =(R|-RT) - две матрицы проектирования с калибровкой K = I. Тогда уравнения проектирования на идеальную плоскость обеих камер записываются в виде:

Найдем эпиполярную линию на втором виде, соответствующую точке m" 1 на первом. Для этого достаточно спроектировать на второй вид две точки, лежащие на луче (C 1 ,m" 1) на второй вид, например центр первой камеры (0,0,0,1) T и точку на плоскости бесконечности (x" 1 ,y" 1 ,z" 1 ,0) T . Проекциями этих точек будут являться соответственно -RT, и R(x" 1 ,y" 1 ,z" 1 ,0) T . Уравнение эпиполярной линии l 2 , проходящей через обе этих точки задается как векторное произведение:

l 2 =RT×R(x" 1 ,y" 1 ,z" 1) T =R(T×(x" 1 ,y" 1 ,z" 1) T)

В матричной форме векторне произведение T×(x" 1 ,y" 1 ,z" 1) T можно записать с помощью матрицы S:

Тогда эпиполярное ограничение на точки в идеальной плоскости записывается как:

Выражение существенной матрицы через параметры внешней калибровки двух камер используется для вычисления относительного положения камер.

Геометрические свойства трех и более изображений

Пусть C 1 ,C 2 и C 3 - центры трех видов одной и той же трехмерной сцены. В этом случае, эпиполярные ограничения накладываются на соответствующие точки любой пары видов. Если известны проекции двух точек m 1 и m 2 на первый и второй вид, то положение проекции на третье изображение может быть найдено как пересечение двух эпиполярных видов, соответствующих точкам m 1 и m 2 .

По двум известным проекциям m 1 и m 2 на два изображения с известной калибровкой можно определить положение точки M в пространстве. Поэтому если известна калибровка третьего изображения, то проекция точки M на третий вид может быть определена простой проекцией.

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

Произведения годов. Волошин Максимилиан. ДОБЛЕСТЬ ПОЭТА. 1. Править поэму, как текст заокеанской депеши: Сухость, ясность, нажим - начеку каждое слово.

Букву за буквой врубать на твердом и тесном камне: Чем скупее слова, тем напряженней их сила. Мысли заряд волевой равен замолчанным строфам.

Вытравить из словаря слова «Красота», «Вдохновенье» - Подлый жаргон рифмачей Поэту - понятья: Правда, конструкция, план, равносильность, cжатость и точность. В трезвом, тугом ремесле - вдохновенье и честь поэта: В глухонемом веществе заострять запредельную зоркость. Волошин М.А. Библиотека: Орловская областная научная универсальная публичная библиотека им. И.А. Бунина. - М., ; Избранные произведения: В 2-х т.

М., ; Красный дым: Повести. - М., ; Гладышев из разведроты: Повести. - М., ; Эшелон; Неизбежность: Романы. Много занимался переводами марийских и удмуртских поэтов. Время от времени пробовал свои силы также в прозе. Соч. Максимилиан Александрович Волошин () - один из крупнейших поэтов первой трети XX века. Это талантливый художник, многогранный лирик, прошедший путь от символистских, эзотерических стихотворений к гражданско-публицистической и научно-философской поэзии, через антропософские пристрастия - к «идеалу Града Божия».

Предлагаемое издание дает возможность читателю ознакомиться не только с лучшими поэтическими произведениями Волошина, но также - с его наиболее интересными работами по эстетике, мемуарной прозой, публицистикой и письмами, имеющими отношение к драматическим событиям в жизни стран. Автор. Волошин Максимилиан. Все стихи автора. Произведение. Доблесть поэта. 2. Звёзды. Создавать избранные коллекции авторов и стихов!

Общаться с единомышленниками! Писать отзывы, участвовать в поэтических дуэлях и конкурсах! Присоединяйтесь к лучшему! Спасибо, что присоединились к Поэмбук! На вашу почту отправлено письмо с данными доступа к аккаунту!

Необходимо авторизоваться в течение 24 часов. В противном случае аккаунт будет удален! Зарегистрированные пользователи получают массу преимуществ: Публиковать стихи - реализовать свой талант! Создавать избранные коллекции авторов и стихов! Общаться с единомышленниками! Писать отзывы, участвовать в поэтических дуэлях и конкурсах!. Максимилиан Волошин. Описание. Максимилиан Александрович Волошин - один из крупнейших поэтов первой трети XX века.

Это талантливый художник, многогранный лирик, прошедший путь от символистских, эзотерических стихотворений к гражданско-публицистической и научно-философской поэзии, через антропософские пристрастия - к "идеалу Града Божия". Предлагаемое издание дает возможность читателю ознакомиться не только с лучшими поэтическими произведениями Волошина, но также - с его наиболее интересными работами по эстетике, мемуарной прозой, публицистикой и письмами, имеющими отношение к драмати.

Избранные произведения и письма. М. А. Волошин. Цена. руб. Максимилиан Александрович Волошин - один из крупнейших поэтов первой трети XX века. Это талантливый художник, многогранный лирик, прошедший путь от символистских, эзотерических стихотворений к гражданско-публицистической и научно-философской поэзии, через антропософские пристрастия - к "идеалу Града Божия".

Волошин М.А., Доблесть поэта: Избранные произведения и письма. серия: Новая библиотека русской классики: обязательный экземпляр Парад, г., стр., Описание книги. Максимилиан Александрович Волошин () - один из крупнейших поэтов первой трети XX века. Это талантливый художник, многогранный лирик, прошедший путь от символистских, эзотерических стихотворений к гражданско-публицистической и научно-философской поэзии, через антропософские пристрастия - к «идеалу Града Божия».

Categories Post navigation

Сегодня мы более подробно рассмотрим устройство виртуальной камеры. Начнём с картинки.

На рисунке мы видим координатное пространство камеры. Направление ("взгляд") камеры всегда совпадает с положительным направлением оси z, а сама камера расположена в начале координат.

Внутреннее пространство пирамиды изображённой на рисунке - это та часть виртуального мира, которую увидит пользователь.

Обратите внимание на три плоскости. Первая расположена на расстоянии 1 по оси z. Это ближняя плоскость. То что находится до неё игрок никогда не увидит. В данном случае значение z равно единице, но вообще говоря, оно может быть любым. Именно с ближней плоскостью связан один дефект отображения графики. Этот дефект проявляется прежде всего в шутерах (из-за большой свободы камеры). Когда ты слишком близко подходишь к объекту, то можно оказаться "внутри". Из последних игр этот дефект особенно сильно проявлялся в Left 4 dead: когда на игрока наваливалась толпа зомби, то очень часто можно было заглянуть внутрь других персонажей.

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

Шесть плоскостей ограничивающих пространство, которое увидит пользователь, называются отсекающими (clipping planes): левая правая верхняя нижняя ближняя и дальняя.

Плоскость расположенная между ближней и дальней - проекционная. В дальнейшем, эту плоскость мы будем располагать в z=1, т.е. она будет совпадать с ближней. Здесь я отделил ближнюю и проекционную плоскости, чтобы показать, что это всё-таки не одно и то же. Проекционная плоскость предназначена для последнего преобразования координат: преобразование из трёхмерного пространства камеры - в двухмерное пространство.

Именно благодаря проекционной плоскости пользователь увидит виртуальный мир. Собственно, эта плоскость и есть то, что увидит пользователь. Проекционная плоскость напрямую связана с такими понятиями как основной/фоновый буферы, окно программы и экран пользователя. Все эти понятия можно рассматривать как прямоугольную картинку, которая в памяти компьютера представлена массивом цифр.

Преобразование координат из трёхмерного мира в проекционную плоскость - самое сложное из тех, которые на данный момент были нами изучены.

Поле зрения/зона обзора (field of view)

На рисунке выше у проекционной плоскости (а значит и у изображения, которое увидит пользователь) ширина больше высоты. Ширина и высота проекционной плоскости задаются с помощью углов. Встречаются разные названия этих углов: поля зрения или зоны обзора. В английском - fields of view.

Зоны обзора задаются двумя углами. Назовём их: fovx - зона обзора по горизонтали, fovy - зона обзора по вертикали. Подробно о зонах обзора: ниже.

Z-буфер / w-буфер / буфер глубины (z-buffer / w-buffer / depth buffer)

Посмотрим на картинку, на которой представлено два треугольника: на расстоянии в 25 и 50 единиц от камеры. На рисунке (а) показано местоположение треугольников в пространстве (вид сверху), а на рисунке (б) можно увидеть конечное изображение:

Как вы возможно догадываетесь, изображение нужно рисовать начиная с самых дальных элементов и заканчивая самыми ближними. Очевидное решение: вычислить расстояние от начала координат (от камеры) до каждого объекта, а затем сравнить. В компьютерной графике используется немного более усовершенствованный механизм. У этого механизма несколько названий: z-буфер, w-буфер, буфер глубины. Размер z-буфера по количеству элементов совпадает с размером фонового и основного буферов. В z-буфер заносится z-компонента самого ближнего к камере объекта. В данном примере, там где синий треугольник перекрывает зелёный, в буфер глубины будут занесены z-координаты синего. Мы ещё поговорим о z-буферах более подробно в отдельном уроке.

Ортографическая / параллельная проекция (orthographic / parallel projection)

Операция при которой происходит уменьшение размерности пространства (было трёхмерное пространство, стало двухмерным) называется проекцией. Прежде всего нас интересует перспективная проекция, но сналача мы познакомимся с параллельной (parallel или orthographic projection).

Для вычисления параллельной проекции достаточно отбросить лишнюю координату. Если у нас есть точка в пространстве [ 3 3 3 ], то при параллельной проекции на плоскость z=1, она спроецируется в точку .

Перспективная проекция (perspective projection) на проекционную плоскость

В данном виде проекции все линии сходятся в одной точке. Именно так устроено наше зрение. И именно с помощью перспективной проекции моделируется "взгляд" во всех играх.


Сравните этот рисунок с рисунком показывающим однородные координаты из предыдущего урока. Чтобы из трёхмерного пространства перейти в двухмерное, нужно первые две компоненты векторов разделить на третью: [ x/z y/z z/z ] = [ x/z y/z 1 ].

Как я уже писал выше, проекционная плоскость может располагаться где угодно между ближней и дальней. Мы будем всегда размещать проекционную плоскость в z=1, но в этом уроке мы рассмотрим и другие варианты. Посмотрим на картинку:


Расстояние до проекционной плоскости от начала координат обозначим как d. Мы рассмотрим два случая: d=1 и d=5. Важный момент: третья компонента всех векторов после проекции должна быть равна d - все точки расположены в одной плоскости z=d. Этого можно добиться умножив все компоненты вектора на d: [ xd/z yd/z zd/z ]. При d=1, мы получим: [ x/z y/z 1 ], именно эта формула использовалась для преобразования однородных координат.

Теперь, если мы отодвинем проекционную плоскость в точку z=5 (соотвтественно d=5), мы получим: [ xd/z yd/z zd/z ] = [ 5x/z 5y/z 5 ]. Последняя формула проецирует все векторы пространства в одну плоскость, где d=5.
У нас здесь небольшая проблемка. Предыдущая формула работает с трёхмерными векторами. Но мы договорились использовать четырёхмерные векторы. Четвёртую компоненту в данном случае можно просто отбросить. Но мы не будем этого делать, так как её использование даёт некоторые специфические возможности, которые мы ещё обсудим.

Нужно найти общий делитель третьей и четвёртой компонент, при делении на который в третьей компоненте остаётся значение d, а в четвёртой единица. Делитель этот - d/z. Теперь из обычного вектора [ x y z 1 ] нам нужно получить вектор готовый к проекции (делению) [ x y z z/d ]. Делается это с помощью матрицы преобразования (проверьте результат умножив любой вектор на данную матрицу):


Последнее преобразование - это ещё не проекция. Здесь мы просто приводим все векторы к нужной нам форме. Напоминаю, что мы будем размещать проекционную плоскость в d=1, а значит векторы будут выглядеть вот так: [ x y z z ].

Матрица перспективного преобразования

Мы рассмотрим матрицу перспективного преобразования использующуюся в DirectX:

Теперь мы знаем для чего предназначен элемент _34. Мы также знаем, что элементы _11 и _22 масштабируют изображение по горизонтали и вертикали. Давайте посмотрим, что конкретно скрывается за именами xScale и yScale.

Данные переменные зависят от зон обзора, о которых мы говорили выше. Увеличивая или уменьшая эти углы, можно масштавбировать (scale или zoom) изображение - менять размер и соотношение сторон проекционной плоскости. Механизм масштабирования отдалённо напомниает масштабирование в фотоаппаратах/камерах - принцип очень похожий. Рассмотрим рисунок:


Разделим угол fov на две части и рассмотрим только одну половинку. Что мы тут видим: увеличивая угол fov/2 (а соответсвенно и угол fov), мы увеличиваем sin угла и уменьшаем cos. Это приводит к увеличению проекционной плоскости и соответственно к уменьшеню спроецированных объектов. Идеальным для нас углом будет fov/2 = P/4. Напоминаю, что угол в P/4 радиан равен 45 градусам. При этом fov будет равен 90 градусам. Чем для нас хорош угол в 45 градусов? В данном случае не происходит масштабирования, а cos(P/4)/sin(P/4)=1.

Теперь мы можем легко масштабировать картинку по вертикали (горизонтали), используя синус и косинус половины зоны обзора (функция котангенса в C++ называется cot):

yScale = cos(fovY/2)/sin(fovY/2) = cot(fovY/2)
В DirectX используется только вертикальная зона обзора (fovY), а масштабирование по горизонатли зависит от вертикальной зоны обзора и соотношения сторон.

Напоминаю, что окно в наших программах размером в 500x500. Соотношение сторон: 1 к 1. Поэтому переменные будут равны: xScale=1, yScale=1.

Соотношение сторон стандартного монитора/телевизора: 4:3. Этому соотношению соответствуют разрешения экрана: 640x480, 800x600, 1600x1200. Мы пока не будем касаться полноэкранного режима, но можем изменить размер окна программы. Вы можете поменять размер окна (в present parameters), например, на 640X480. Но чтобы все предметы не растянулись (квадраты будут выглядеть как прямоугольники), не забудьте поменять соответствующие переменные в проекционной матрице.

Чуть не забыл, форумула для xScale в DirectX:

xScale = yScale / соотношение сторон
Соотношения сторон задаются просто: 1/1, 4/3, 16/9 - это из стандартных.

Осталось выяснить назначение элементов _33, _34 матрицы перспективного преобразования. zf - z-координата дальней плоскости (от far - далеко), а zn - z-координата ближней (от near - близко). Обратите внимание, что элемент _43 = _33 * -zn.

Легче всего понять, что именно делают эти формулы, можно на примерах. Умножим стандартный вектор [ x y z w ] на матрицу представленную выше. Рекомендую вам сделать это, взяв лист бумаги и карандаш (надеюсь вы помните как перемножать две матрицы). Компоненты вектора примут следующий вид.

1-ая = x*xScale
2-ая = y*yScale
3-я = z*(zf/(zf-zn)) + w*(-(zn*zf)/(zf-zn)) = (zf/(zf-zn))*(z - w*zn)
4-ая = (w*z)/d
Совершим проекционное преобразование (разделим все элементы на 4-ую компоненту, при этом допустим, что d=1 и w=1):

1-ая = (d*x*xScale)/(w*z) = (x*xScale)/z
2-ая = (d*y*yScale)/(w*z) = (y*xScale)/z
3-я = (zf/(zf-zn))*(z - w*zn)*(w*d/z) = (zf/(zf-zn))*(1 - zn/z)
4-ая = 1
В результате мы получили вектор вида:

[ x/(z*xScale) y/(z*yScale) (zf/(zf-zn))*(1-zn/z) 1 ]
Теперь, если вы зададите конкретные значения zf и zn, то обнаружите следующее (для положительных значений): если вектор расположен до ближней плоскости, то z-компонента после преобразования будет меньше нуля, если вектор расположен за дальней плоскостью, то z-компонента будет больше единицы.

Нет никакой разници где именно расположены ближняя и дальняя плоскости: zn=1, zf=10 или zn=10, а zf=100 (или любые другие значения) - после преобразования видимая область будет располагаться в отрезке от нуля до единицы, включительно.

Именно для этого и предназначены формулы в элементах _33, _34 проекционной матрицы - спроецировать расстояние от ближней до дальней плоскости в отрезок . Проверьте это, вычислив значения нескольких векторов для конкретных значений zn,zf (да-да, на листке бумаги!!!).