Контрольная
Типовой

Курсовая

Практикум
Карта

Визуализация трехмерных изображений

Проецирование трехмерных объектов на картинную плоскость

Важнейшей операцией при визуализации трехмерной графики является проектирование, поскольку изображение строится на плоской поверхности экрана.

Проектирование – это преобразование, ставящее в соответствие точкам трехмерного пространства точки на некоторой плоскости, называемой картинной.

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

Параллельное проектирование (рис. 25) Пусть уравнение плоскости задано в виде nxx + nyy nzz d = 0, где x, y, z – координаты произвольной точки p этой плоскости. Уравнение может быть записано скалярного произведения векторов: n=(nx, ny, nz) и z): (n, p)

Рассмотрим плоскость π: (n, p) + d = 0 в трехмерном пространстве, на которую будет осуществляться проектирование (картинную плоскость). Пусть задан вектор l, вдоль которого проектирование. При этом будем считать, что (l, n) ≠ 0.

Для нахождения проекции произвольной точки q на плоскость π проведем через точку прямую с направляющим вектором l. Точка пересечения этой прямой плоскостью – qпр является проекцией вдоль направления

Координаты произвольной точки q' прямой, проходящей через точку и имеющей направляющий вектор l:

q + tl, t>ÎR.

Тогда параметр t точки пересечения этой прямой и плоскости π можно найти, подставив уравнение в плоскости:

(q + tl, n) d = 0.

Отсюда получаем

Зная t, можно найти проекцию точки q по формуле qпр = q + tl.

Так как параллельное преобразование является аффинным, то его можно задать при помощи матрицы однородного преобразования.

Приведем матрицу канонического параллельного проектирования, осуществляемого на плоскость Oxy вдоль оси Oz.

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

Перспективное проектирование (рис. 26). Рассмотрим картинную плоскость π: (n, p) + d = 0 . Пусть задана точка c, которую будем называть центром проектирования. Тогда перспективной проекцией точки q назовем точку qпр пересечения плоскости π с лучом, выходящим из c и проходящим через при условии, что лежит в положительном полупространстве относительно π.

Пусть проекцией точки q является точка qпр. В силу того, что qпр лежит на отрезке [q, c], справедлива формула

qпр = (1 - t)c + tq, t >Î [0, 1].

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

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

Выпишем каноническое уравнение перспективного преобразования. Пусть центр проектирования равен (0, 0, -1)Т, а картинная плоскость задается уравнением z = 1.

 

Уровни визуализации

Любой объект, в том числе и объемный, может быть изображен различными способами. В одном случае необходимо показать внутреннюю структуру объекта, другом – его внешнюю форму, третьем имитировать реальную действительность.

Условно способы визуализации можно разделить по характеру изображений и степени сложности соответствующих алгоритмов на уровни:

1)каркасная (проволочная) модель;

2)показ поверхностей в виде многоугольников с плоскими гранями или сплайнов удалением невидимых точек;

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

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

Визуализация второго уровня используется для упрощенного показа объемных объектов. Например, графиков функций >
z = f(x, y) (в виде рельефа поверхности) часто достаточно показать все грани сетки одним цветом, но при этом необходимо обязательно удалить невидимые точки. Это более сложная процедура по сравнению с выводом каркасного изображения.

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

 

Каркасная визуализация

Каркас обычно состоит из отрезков прямых линий (соответствует многограннику), хотя можно строить его и на основе кривых, в частности сплайновых кривых Безье. Все ребра, показанные окне вывода видны – как ближние, так дальние.

Для построения каркасного изображения необходимо:

●получить координаты всех вершин в мировой системе координат;

●преобразовать координаты каждой вершины в экранные соответствии с выбранной проекцией;

●выполнить цикл вывода в плоскости экрана всех ребер как отрезков прямых или кривых, соединяющих вершины.

 

Расчет нормали к объекту

Во всех формулах для освещенности у нас так или иначе будет фигурировать вектор N - нормаль к объекту в точке P. Сразу возникает вопрос, а как же этот считать.

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

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

Для вящей понятности приведу кусок псевдокода:

// ...

for (i = 0; i < numberOfVertics; i++) {

vertexNormal[i].x = 0;

vertexNormal[i].y = 0;

vertexNormal[i].z = 0;

}

for (i = 0; i < numberOfVertics; i++) {

for (j = 0; j < numberOfFaces; j++) {

if (face[j].vertex0 == i ||

face[j].vertex1 == i ||

face[j].vertex2 == i)

{

vertexNormal[i].x += faceNormal[j].x;

vertexNormal[i].y += faceNormal[j].x;

vertexNormal[i].z += faceNormal[j].x;

}

}

}

// ...

Аффинные преобразования координат на плоскости

Параллельные проекции

Векторная полигональная модель Для описания пространственных объектов используются следующие элементы: вершины, отрезки прямых (векторы), полилинии, полигоны, полигональные поверхности.


На главную сайта