Как вычислить координату z в перспективной проекции. Геометрические свойства нескольких изображений

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

Это не решение проблемы! Давайте разбираться вместе!

Будем реалистами с практическим уклоном и возьмём в качестве подопытного OpenGL версии 3.3. Начиная с этой версии каждый разработчик обязан самостоятельно реализовывать модуль матричных операций. Замечательно, это то, что нам нужно. Проведём декомпозицию нашей с вами нелёгкой задачи и выделим основные моменты. Немного фактов из спецификации OpenGL:

  • Матрицы хранятся по столбцам (column-major);
  • Однородные координаты;
  • Канонический объём отсечения (CVV) в левосторонней системе координат.
Существует два способа хранения матриц: сolumn-major и row-major. На лекциях по линейной алгебре как раз используется схема row-major. По большому счёту представление матриц в памяти не имеет значения, потому что матрицу всегда можно перевести в одного вида представления в другое простым транспонированием. А раз разницы нет, то для всех последующих расчётов мы будем использовать классические row-major матрицы. При программировании OpenGL есть небольшая хитрость, которая позволяет отказаться и от транспонирования матриц при сохранении классических row-major расчётов. В шейдерную программу матрицу нужно передавать как есть, а в шейдере производить умножение не вектора на матрицу, а матрицы на вектор.

Однородные координаты – это не очень хитрая система с рядом простых правил по переводу привычных декартовых координат в однородные координаты и обратно. Однородная координата это матрица-строка размерности . Для того чтобы перевести декартову координату в однородную координату необходимо x , y и z умножить на любое действительное число w (кроме 0). Далее необходимо записать результат в первые три компоненты, а последний компонент будет равен множителю w . Другими словами:
- декартовы координаты
w – действительное число, не равное 0

- однородные координаты

Небольшой трюк: Если w равно единице, то всё что нужно для перевода, это перенести компоненты x , y и z и приписать единицу в последний компонент. То есть получить матрицу-строку:

Несколько слов о нуле в качестве w . С точки зрения однородных координат это вполне допустимо. Однородные координаты позволяют различать точки и вектора. В декартовой же системе координат такое разделение невозможно.

- точка, где (x, y, z ) – декартовы координаты

- вектор, где (x, y, z ) – радиус-вектор

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

- однородные координаты
- декартовы координаты

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

Канонический объём отсечения или Canonic view volume (CVV) – это одна из мало документированных частей OpenGL. Как видно из рис. 1 CVV – это выровненный по осям куб с центром в начале координат и длиной ребра равной двойке. Всё, что попадает в область CVV подлежит растеризации, всё, что находится вне CVV игнорируется. Всё, что частично выходит за границы CVV, подлежит алгоритмам отсечения. Самое главное что надо знать - система координат CVV левосторонняя!


Рис. 1. Канонический объём отсечения OpenGL (CVV)

Левосторонняя система координат? Как же так, ведь в спецификации к OpenGL 1.0 ясно написано, что используемая система координат правосторонняя? Давайте разбираться.


Рис. 2. Системы координат

Как видно из рис. 2 системы координат различаются лишь направлением оси Z . В OpenGL 1.0 действительно используется правосторонняя пользовательская система координат. Но система координат CVV и пользовательская система координат это две совершенно разные вещи. Более того, начиная с версии 3.3, больше не существует такого понятия как стандартная система координат OpenGL. Как упоминалось ранее, программист сам реализует модуль матричных операций. Формирование матриц вращения, формирование проекционных матриц, поиск обратной матрицы, умножение матриц – это минимальный набор операций, входящих в модуль матричных операций. Возникает два логичных вопроса. Если объём видимости это куб с длиной ребра равной двум, то почему сцена размером в несколько тысяч условных единиц видна на экране? В какой момент происходит перевод пользовательской системы координат в систему координат CVV. Проекционные матрицы – это как раз та сущность, которая занимается решением этих вопросов.

Главная мысль вышеизложенного – разработчик сам волен выбрать тип пользовательской системы координат и должен корректно описать проекционные матрицы. На этом с фактами об OpenGL закончено и подошло время сводить всё воедино.

Одна из наиболее распространённых и сложно постигаемых матриц – это матрица перспективного преобразования. Так как же она связана с CVV и пользовательской системой координат? Почему объекты с увеличением расстояния до наблюдателя становятся меньше? Для того чтобы понять почему объекты уменьшаются с увеличением расстояния, давайте рассмотрим матричные преобразования трёхмерной модели шаг за шагом. Не секрет, что любая трёхмерная модель состоит из конечного списка вершин, которые подвергаются матричным преобразованиям совершенно независимо друг от друга. Для того чтобы определить координату трёхмерной вершины на двухмерном экране монитора необходимо:

  1. Перевести декартову координату в однородную координату;
  2. Умножить однородную координату на модельную матрицу;
  3. Результат умножить на видовую матрицу;
  4. Результат умножить на проекционную матрицу;
  5. Результат перевести из однородных координат в декартовы координаты.
Перевод декартовой координаты в однородную координату обсуждался ранее. Геометрический смысл модельной матрицы заключается в том, чтобы перевести модель из локальной системы координат в глобальную систему координат. Или как говорят, вынести вершины из модельного пространства в мировое пространство. Скажем проще, загруженный из файла трёхмерный объект находится в модельном пространстве, где координаты отсчитываются относительно самого объекта. Далее с помощью модельной матрицы производится позиционирование, масштабирование и поворот модели. В результате все вершины трёхмерной модели получают фактические однородные координаты в трёхмерной сцене. Модельное пространство относительно мирового пространства является локальным. Из модельного пространства координаты выносятся в мировое пространство (из локального в глобальное). Для этого используется модельная матрица.

Теперь переходим к шагу три. Здесь начинает работу видовое пространство. В этом пространстве координаты отсчитываются относительно положения и ориентации наблюдателя так, как если бы он являлся центром мира. Видовое пространство является локальным относительно мирового пространства, поэтому координаты в него надо вносить (а не выносить, как в предыдущем случае). Прямое матричное преобразование выносит координаты из некоторого пространства. Чтобы наоборот внести их в него, надо матричное преобразование инвертировать, поэтому видовое преобразование описывается обратной матрицей. Как же получить эту обратную матрицу? Для начала получим прямую матрицу наблюдателя. Чем характеризуется наблюдатель? Наблюдатель описывается координатой, в которой он находится, и векторами направления обзора. Наблюдатель всегда смотрит в направлении своей локальной оси Z . Наблюдатель может перемещаться по сцене и осуществлять повороты. Во многом это напоминает смысл модельной матрицы. По большому счёту так оно и есть. Однако, для наблюдателя операция масштабирования бессмысленна, поэтому между модельной матрицей наблюдателя и модельной матрицей трёхмерного объекта нельзя ставить знак равенства. Модельная матрица наблюдателя и есть искомая прямая матрица. Инвертировав эту матрицу, мы получаем видовую матрицу. На практике это означает, что все вершины в глобальных однородных координатах получат новые однородные координаты относительно наблюдателя. Соответственно, если наблюдатель видел определённую вершину, то значение однородной координаты z данной вершины в видовом пространстве точно будет положительным числом. Если вершина находилась за наблюдателем, то значение её однородной координаты z в видовом пространстве точно будет отрицательным числом.

Шаг четыре - это самый интересный шаг. Предыдущие шаги были рассмотрены так подробно намеренно, чтобы читатель имел полную картину о всех операндах четвёртого шага. На четвёртом шаге однородные координаты выносятся из видового пространства в пространство CVV. Ещё раз подчеркивается тот факт, что все потенциально видимые вершины будут иметь положительное значение однородной координаты z .

Рассмотрим матрицу вида:

И точку в однородном пространстве наблюдателя:

Произведём умножение однородной координаты на рассматриваемую матрицу:

Переведём получившиеся однородные координаты в декартовы координаты:

Допустим, есть две точки в видовом пространстве с одинаковыми координатами x и y , но разными координатами z . Другими словами одна из точек находится за другой. Из-за перспективного искажения наблюдатель должен увидеть обе точки. Действительно, из формулы видно, что из-за деления на координату z , происходит сжатие к точке начала координат. Чем больше значение z (чем дальше точка от наблюдателя), тем сильнее сжатие. Вот и объяснение эффекту перспективы.

В спецификации OpenGL сказано, что операции по отсечению и растеризации выполняются в декартовых координатах, а процесс перевода однородных координат в декартовы координаты производится автоматически.

Матрица (1) является шаблоном для матрицы перспективой проекции. Как было сказано ранее, задача матрицы проекции заключается в двух моментах: установка пользовательской системы координат (левосторонняя или правосторонняя), перенос объёма видимости наблюдателя в CVV. Выведем перспективную матрицу для левосторонней пользовательской системы координат.

Матрицу проекции можно описать с помощью четырёх параметров (рис. 3):

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


Рис. 3. Перспективный объём видимости

Рассмотрим проекцию точки в пространстве наблюдателя на переднюю грань отсечения перспективного объёма видимости. Для большей наглядности на рис. 4 изображён вид сбоку. Так же следует учесть, что пользовательская система координат совпадает с системой координат CVV, то есть везде пользуется левосторонняя система координат.


Рис. 4. Проецирование произвольной точки

На основании свойств подобных треугольников справедливы следующие равенства:

Выразим yꞌ и xꞌ:

В принципе, выражений (2) достаточно для получения координат точек проекции. Однако для правильного экранирования трёхмерных объёктов необходимо знать глубину каждого фрагмента. Другими словами необходимо хранить значение компоненты z . Как раз это значение используется при тестах глубины OpenGL. На рис. 3 видно, что значение zꞌ не подходит в качестве глубины фрагмента, потому что все проекции точек умеют одинаковое значение zꞌ . Выход из сложившейся ситуации – использование так называемой псевдоглубины.

Свойства псевдоглубины:

  1. Псевдоглубина рассчитывается на основании значения z ;
  2. Чем ближе к наблюдателю находится точка, тем меньшеe значение имеет псевдоглубина;
  3. У всех точек, лежащих на передней плоскости объёма видимости, значение псевдоглубины равно -1;
  4. У всех точек, лежащих на дальней плоскости отсечения объёма видимости, значение псевдоглубины равно 1;
  5. Все фрагменты, лежащие внутри объёма видимости, имеют значение псевдоглубины в диапазоне [-1 1].
Давайте выведем формулу, по которой будет рассчитываться псевдоглубина. В качестве основы возьмём следующее выражение:

Коэффициенты a и b необходимо вычислить. Для того чтобы это сделать, воспользуемся свойствами псевдоглубины 3 и 4. Получаем систему из двух уравнений с двумя неизвестными:

Произведём сложение обоих частей системы и умножим результат на произведение fn , при этом f и n не могут равняться нулю. Получаем:

Раскроем скобки и перегруппируем слагаемые так, чтобы слева осталась только часть с а , а справа только с b :

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

Умножим обе стороны на -2fn , при этом f и n не могут равняться нулю. Приведём подобные, перегруппируем слагаемые и выразим b :

Подставим (7) в (6) и выразим a :

Соответственно компоненты a и b равны:

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

Пусть расстояние до передней плоскости отсечения n равно 2, а расстояние до дальней плоскости отсечения f равно 10. Рассмотрим пять точек в однородном пространстве наблюдателя:

Взаимное расположение точки и объёма видимости
Точка Значение Описание
1 1 Точка находится перед передней плоскостью отсечения объёма видимости. Не проходит растеризацию.
2 2 Точка находится на передней грани отсечения объёма видимости. Проходит растеризацию.
3 5 Точка находится между передней гранью отсечения и дальней гранью отсечения объёма видимости. Проходит растеризацию.
4 10 Точка находится на дальней грани отсечения объёма видимости. Проходит растеризацию.
5 20 Точка находится за дальней гранью отсечения объёма видимости. Не проходит растеризацию.

Умножим все точки на матрицу (8), а затем переведём полученные однородные координаты в декартовые координаты . Для этого нам необходимо вычислить значения новых однородных компонент и .
Точка 1:

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

С координатой z разобрались, перейдём к координатам x и y . Как говорилось ранее весь перспективный объём видимости должен умещаться в CVV. Длина ребра CVV равна двум. Соответственно, высоту и ширину перспективного объёма видимости надо сжать до двух условных единиц.

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


Рис. 5. Объём видимости

Из рис. 5 видно, что:

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

На этом вывод матриц закончен.

Пару слов о DirectX - основном конкуренте OpenGL. DirectX отличается от OpenGL только габаритами CVV и его позиционированием. В DirectX CVV - это прямоугольный параллелепипед с длинами по осям x и y равными двойке, а по оси z длина равна единице. Диапазон x и y равен [-1 1], а диапазон z равен . Что касается системы координат CVV, то в DirectX, как и в OpenGL, используется левосторонняя система координат.

Для вывода перспективных матриц для пользовательской правосторонней системы координат необходимо перерисовать рис. 2, рис.3 и рис.4 с учётом нового направления оси Z . Далее расчёты полностью аналогичны, с точностью до знака. Для матриц DirectX свойства псевдоглубины 3 и 4 модифицируются под диапазон .

На этом тему перспективных матриц можно считать закрытой.

В центральных проекциях грани отображаемого объекта, параллельные картинной плоскости, изображаются без искажения формы, но с искажением размера.

Рисунок 24 Центральные проекции куба: а) одноточечная, б) двухточечная, в) трехточечная.

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

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

Одноточечная проекция получается, когда картинная плоскость совпадает с одной из координатных плоскостей (или параллельна ей). Т.е., только одна ось координат не параллельна картинной плоскости и имеет главную точку схода.

Двухточечная проекция получается, когда только одна из координатных осей параллельна картинной плоскости. Две другие оси координат не параллельны картинной плоскости и имеют две главные точки схода. При изображении объектов, расположенных на поверхности земли, наиболее часто используется двухточечная проекция, при которой картинной плоскости параллельна вертикальная ось координат. Обе главные точки схода расположены на одной горизонтальной линии – линии горизонта (рис. 6.5). Притрехточечной проекции все три координатные оси не параллельны картинной плоскости и, следовательно, имеются три главные точки схода.

Рассмотрим более подробно случай одноточечного проецирования точки Р на плоскостьz = 0 с центром проецированияС , лежащим на осиz (рис.25).

Точка A проецируется на экран какA . Расстояние от наблюдателя до проекционной плоскости равноk. Необходимо определить координаты точкиA на экране. Обозначим ихx э иy э. Из подобия треугольниковA y A z N иy э ON находим, что

(x.9)

аналогично для x:

. (x.10)

Рис. 25. Вывод формул центральной проекции.

Рис. 26. Другой способ вычисления координат точек в центральной перспективной проекции.

Напомним, что k -это расстояние, а наблюдатель находится в точке N = (0,0,-k ). Если точку наблюдения поместить в начало координат, а проекционную плоскость на расстояниеa , как показано на рисунке 26, то формулы дляx э и y э примут вид:

,
(x.11)

Формулы (x.10) более удобны при необходимости простым образом приближать или удалять наблюдателя от проекционной плоскости. Формулы (x.11) требуют меньше времени для вычислений за счет отсутствия операции сложения.

Рассмотрим точку трехмерного пространства (a , b , c ). Если представить эту точку как однородное представление точки двумерного пространства, то ее координаты будут (a / c , b / c ). Сравнивая эти координаты со вторым видом формул, выведенных для центральной перспективной проекции, легко заметить, что двумерное представление точки с координатами (a , b , c ) выглядит как ее проекция на плоскостьz = 1, как показано на рис. 27.

Рис. 27. Проекция точки (a , b , c ) на плоскость z = 1.

Аналогично, рассматривая применение однородных координат для векторов трехмерного пространства, можно представить трехмерное пространство как проекцию четырехмерного пространства на гиперплоскость w = 1, если (x , y , z )(wx , wy , wz , w ) = (x , y , z , 1). .

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

Покажем, что эта матрица определяет преобразование точки объекта, заданной в однородных координатах, в точку перспективной проекции (также в однородных координатах). Пусть p = (x , y , z ) – точка в трехмерном пространстве. Ее однородное представлениеv = (wx , wy , wz , w ). УмножимvнаP :

это в точности повторяет формулы (x.10), выведенные для центральной перспективы.

Из-за особенностей человеческого зрения к удаленным от наблюдателя объектам лучше применять перспективную проекцию, к достаточно близким (на расстоянии вытянутой руки) – ортографическую или аксонометрическую, а к еще более близким объектам – обратную перспективную проекцию.

Для создания стереоизображений используются две центральные проекции, центры которых совпадают с расположением глаз гипотетического наблюдателя, т.е. они расположены на некотором расстоянии друг от друга на прямой, параллельной картинной плоскости. После выполнения проецирования получают два изображения объекта – для левого и правого глаза. Устройство вывода должно обеспечивать подачу этих изображений к каждому глазу пользователя отдельно. Для этого может использоваться система цветных или поляризационных фильтров. Более сложные устройства вывода (например, шлемы) подают каждое из изображений на отдельные экраны для каждого глаза.

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

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

Рис. 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 Трехточечная перспективная проекция с поворотом вокруг двух осей.

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

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

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

Вектор V может задаваться в одной из двух форм (Рис. 6.2‑1):

1)в полярной системе координат через параметрами:

R- модуль вектораV ;

Q -угол между координатной осью X и проекцией вектора V на координатную плоскость XY мировой системы координат;

J -угол между вектором V и осью Z мировой системы координат;

2)в декартовой системе координат через проекции вектора V на координатные оси мировой системы координат:

V x – проекция вектора V на ось X ;

V y – проекция вектора V на ось X ;

V z – проекция вектора V на ось X .


Рис. 6.2 1

Задача проецирования графического объекта, в конечном счете, сводится к определению координат X ,Y отдельных точек объекта на плоскости проецирования, которые изначально заданны тремя координатами в мировой системе координат.

Определение координат точки на плоскости проекции

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

Преобразование для перехода из мировой системы координат в видовую систему координат

Преобразования для перехода из видовой системы координат в координаты на плоскости проекции.

Переход в видовую систему координат

Переход в видовую систему координат иллюстрируется ниже приведенным рисунком (Рис. 6.2‑2).

Видовая система координат представляет собой такую трехмерную систему координат с координатными осями X в , Y в , Z в , которая «удобна» для заданной проекции, т.е. из которой наиболее просто осуществляется переход в двумерную систему на плоскости проекции (например, экран). Для данного вида перспективной проекции начало видовой системы координат должно находиться в точке E , ее ось Z в должна совпадать с вектором проекции V , ее ось X в должна проецироваться на ось X э , а ее ось Y в должна проецироваться на ось Y э .



Рис. 6.2 2

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

1)перенос мировой системы координат на вектор V , в результате чего будет получена система координат c началом в точке E и координатными осями X 1 , Y 1 , Z 1 (реализуется матрицей Т -1 (-V x , -V y , -V z ));

2)поворот полученной системы на угол (-(90 0 -q) )относительно ее координатной оси Z 1 , в результате чего будет получена система с координатными осями X 2 , Y 2 , Z 2 (реализуется матрицей R z -1 (-(90 0 -q)) , в которой вектор V находится в координатной полскости Y 2 , Z 2 ;

3)поворот полученной системы E , X 1 , Y 1 , Z 1 на угол ((180 0 - j)) относительно ее координатной оси X 2 , в результате чего будет получена система с координатными осями X 3 , Y 3 , Z 3 , начало которой находится в точке E , (реализуется матрицей R x -1 (180 0 - j)) , в которой вектор V располагается на оси Z 3 ;

4)смена направления координатной оси X 3 , в результате чего будет получена нужная видовая система координат с координатными осями X в , Y в , Z в (реализуется матрицей R (-x )).

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

Для задания используемых матриц представим все их элементы через тригонометрические функцииsin j , cos j , sin q , cos q и введем обозначения:

cos j= a ; sin j = b ; cos q = с; sin q = d ;

u x = -r bc ; u y = -r bd ; u z =-r a .

С этой целью представим перечисленные в выше приведенном выражении матрицы в следующем виде.

Матрица переноса :

T -1 (u x , u y , u z )= T (-u x , -u y , -u z ).

Такой представление правомерно, так как обратная матрица переноса на вектор эквивалентна прямой матрицы переноса на этот же вектор в обратной направленности.

C учетом введенных обозначений будем иметь:

Матрицы поворота относительно оси Z 1:

R z -1 (-(90 0 -Q))= R z (90 0 -Q),

и, учитывая, что sin (90 0 -a)= cos a, можно записать:


Матрицы поворота относительно координатной оси X 2:

R x -1 ((180 0 -j))= R x (-(180 0 -j)) ,

и, учитывая, что sin (-(180 0 -j)) =- sin j, cos (-(180 0 -j)) =- cos j, имеем:

Матрица смены направления координатной оси X 2 имет вид:

Найдем матрицу видового преобразования R в:

Определим порядок умножения матриц согласно скобок в записи:

Найдем R1:


Найдем произведение:


При нахождении матрицы видового преобразования R в, учтем необходимость расширения матрицы R 2 из размерности 3*3 до размерности 4*4:


Таким образом, матрица видового преобразования имеет вид:

(6.2-1)

Переход из видовой системы к координатам на плоскости проекции.

Для выполнения этого этапа используем ниже приведенный рисунок (Рис. 6.2‑3).


На рисунке приняты следующие обозначения:

Е – начало видовой системы координат с координатными осями X в , Y в , Z в ;

Т1 – точка в видовой системе координат, расположенная на координатной плоскости X в Z в ;

Т2– точка в видовой системе координат, расположенная на координатной плоскости Y в Z в ;

D - расстояние от начала видовой системы координат до плоскости проекции;

X э , Y э - оси системы координат на плоскости проекции (на экране).

Из приведенного рисунка видно, что:

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

(6.2-2)

Таким образом, используя матрицу видового преобразования R в , определяемую выражением (6.2-1), и соотношения согласно выражениям (6.2-2), можно рассчитать координаты заданных точек на плоскости перспективной проекции.

Точки и линии схода

При перспективной проекции точка схода прямой АА’ назыавется та точка на плоскости проекции, к которой стремится проекция точки, «убегающей» в бесконечность по прямой АА’. Для того, чтобы представить геометрический смысл точек схода, рассмотрим ниже приведенный рисунок (Рис. 6.2‑4).

На рисунке используются следующие обозначения:

Е - начало видовой системы координат;

«пп» - плоскость проекции (экран) с координатными осями X и Y .



Рис. 6.2 4

Проведем через точку Е прямую Еа’, перпендикулярную плоскости проекции. Эта линия пересекается с плоскостью проекции в точке а п , которая будет являться точкой проекции всех точек прямой Еа’, в том числе и точки, убегающей по этой прямой в бесконечность. Следовательно, точка а п является точкой схода для линии Еа’.

Возьмем на плоскости проекции некоторую точку b п и проведем через нее линию b п b ’, параллельную линии Еа’. Проведем через линии Еa ’ и b п b ’ плоскость, которая пересечется с плоскостью проекции по линии b п a п . Возьмем на линии b п b ‘ точку b б и устремим ее по прямой в бесконечность.

По мере перемещения бегущей точки по прямой в бесконечность, ее проекцияb бп будет перемещаться по прямой b п a п , стремясь к точке a п по мере стремления точки b п в бесконечность. Таким образом, точка a п будет являться точкой схода для прямой b п b ‘.

Единственным условием для выбора прямой bb ’ являлось то, что она параллельна прямой Еa ’. Следовательно, для всех прямых, параллельных Еa ’, точкой схода будет являться одна и та же точка a п .

Проведем в плоскости проекции через точку a п прямую, параллельную оси X плоскости проекции и возьмем на ней произвольную точку d п . Проведем прямую через точки E и d п . Затем возьмем на плоскости проекции еще одну произвольную точкуc п и проведем через нее в видовой системе координат прямуюc п c , параллельную прямой Ed п .

Через полученные параллельные прямые проведем плоскость, которая пересечет плоскость проекции по прямой d п с п . Возьмем на прямой с п с точку c б и устремим ее в бесконечность. Как видно из рисунка, по мере перемещения точки c б. в бесконечность, ее проекция будет перемещаться по прямой c п d п. , стремясь к точке d п . Отсюда следует, что точка d п является точкой схода для прямой с п с.

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

Из изложенного следует, что прямая d п а п является линией схода для всех горизонтальных плоскостей. Эта прямая называется линией горизонта.

Из изложенного также можно заключить, что все параллельные линии, независимо от их положения, имеют одну точку схода. Сказанное относится и к вертикальным линиям, которые имеют единую точку схода, называемую точкой зенита .

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

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

Пусть необходимо построить проекцию параллелепипеда, с вертикальными боковыми гранями, имеющий верхнюю грань, заданную опорными точками 1, 2,3, 4, и нижнюю, заданную узловыми точками 5, 6, 7, 8 (Рис. 6.2‑5).

Отметим, что из свойства заданного объекта ребра, заданные узловымии точками 1,2; 3,4; 5,6; 7,8, параллельные, а, следовательно, несущие их прямые сходятся в одной точке (точка Тс1). Прямые, несущие боковые ребра 3,7; 4,8; 2,6 и 1,5, так же имеют одну и ту же точку схода (точка Т3). То же самое можно сказать о ребрах 1,3; 2,4; 5,7; 6,8 – несущие их прямые параллельны друг другу, а следовательно, имеют единую точку схода (точка Тс2).

Для однозначного построения проекции заданного объекта достаточно на проекции определить три выше упомянутые точки схода (Т3, Тс1, Тс2), и проекции точек 2,5,6,8 (Рис. 6.2‑6).


Рис. 6.2 5

Построение проекции можно вести в следующей последовательности.

Через точки 5 и Тс2 проведем прямую линию, несущую ребра 5,7. Ее пересечение с линией, проходящей через точки Тс1 и 8 (прямой линии,



Рис. 6.2 6

несущей ребро 7,8), является точкой 7. Несущие для боковых ребер 3,7; 4,8; 2,6 и 1,5 будут получены, если провести прямые через точку зенита Т3 и уже имеющиеся четыре узловые точки нижней грани параллепипеда (линии Т3,6; Т3,7; Т3,8; Т3,5).

Затем проведем прямые Тс1,2. Точка ее пересечения с прямой Т3,5 будет являться точка 1. Проведем линии Тс1,4. Точка ее пересечения с прямой T 3,7 будет являться точка 3.

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

Для того, чтобы при проецировании был получен образ объекта, близкий к тому, каким он субъективно воспринимается человеком, необходимо ограничивать угол проецирования (угол обзора наблюдателем трех мерного объекта из точки наблюдения, т.е. из точки начала видовой системы координат). Как правило, приемлемый результат проецирования получается, когда угол проецирования не превышает 30-40 градусов.

Рассмотренный метод проецирования приемлем лишь для сравнительно простых объектов.



Понравилась статья? Поделитесь с друзьями!