Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
графика ответы.docx
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
238.4 Кб
Скачать

Изображение трехмерных объектов

Процесс вывода 3D графической информации по существу более сложный, чем соответствующий

процесс вывода 2D графической информации. В двумерном случае просто задается окно в

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

В общем случае объекты, описанные в мировых координатах, отсекаются по границе видимого объема,

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

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

Для двумерного случая существуют следующие понятия и термины, которые можно распространить

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

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

каждой координатной оси. Заданное окно в мировых координатах должно быть выведено на

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

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

вне границ окна, на экран не отображается, а примитив, частично попадающий на экран, отсекается

по краю окна перед отображением. Перемещая окно и выполняя изменения его размеров, мы можем

создавать такие кинематографические эффекты, как панорамирование (zoom), крупный или мелкий

план. Несоответствие между пространственными объектами и плоскими изображениями устраняются

путем введения проекций, которые отображают трехмерные объекты на двумерной проекционной

картинной плоскости.

Концептуальная модель процесса вывода 3D графической информации.

В процессе вывода 3D графической информации мы задаем видимый объем в мировом пространстве,

проекцию на картинную плоскость и поле вывода на видовой поверхности. В общем случае объекты,

определенные в 3D мировом пространстве, отсекаются по границе трехмерного видимого объема и

после этого проецируются. То, что попадает в пределы окна, которое само является проекцией

видимого объема на картинную плоскость, затем преобразуется (отображается) в поле вывода и

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

оперирующих с 3D объектами.

Проекции

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

, в точки системы координат меньше чем n. С помощью проецирования три измерения отображаются в два.

Проекции трехмерного объекта (представленного в виде совокупности точек) строится при помощи

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

объекта и, пересекая картинную плоскость, образуют проекцию.

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

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

между центром проекции и проекционной плоскостью. Если расстояние между ними конечно, то проекция

будет центральной, если же оно бесконечно, то проекция будет параллельной. Параллельные проекции на

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

центральной проекции мы явно задаем центр проекции, в то время как определяя параллельную проекцию,

мы указываем направление проецирования. Центральная проекция порождает визуальный эффект,

аналогичный тому, к которому приводят фотографические системы или зрительная система человека,

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

Этот эффект известен как перспективное укорачивание. Размер центральной проекции объекта изменяется

пропорционально расстоянию от центра проекции до объекта. Это означает, что хотя центральная проекция

и является реалистичной, она оказывается непригодной для представления точной формы и размеров объектов;

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

которые параллельны проекционной плоскости; проекции параллельных линий в общем случае не параллельны.

Параллельная проекция порождает менее реалистичное изображение, поскольку отсутствует перспективное

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

Проекция фиксирует истинные размеры, и параллельные прямые остаются параллельными. Как и в случае

центральной проекции, углы сохраняются только на тех гранях объекта, которые параллельны

проекционной плоскости.

Алгоритм плавающего горизонта

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

линий трехмерного представления функций, описывающих поверхность в виде: F(x,y,z) = 0

Подобные функции возникают во многих приложениях, в  математике, технике,

естественных науках и др.

Поскольку в приложениях в основном интересуются описанием поверхности,

этот алгоритм обычно работает в пространстве изображения.

Главная идея данного метода заключается в сведении трехмерной задачи к двумерной

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

плоскостей, имеющих постоянные значения координат  x,y или z

Указанные параллельные плоскости, определяются постоянным значением z. Функция

F(x,y,z) = 0 сводится к последовательности кривых, лежащих на каждой из этих  параллельных

плоскостей,  например к последовательности  y=f(x,z) или x=g(y,z), где  z  постоянна на

каждой из заданных параллельных плоскостей.

Алгоритм удаления невидимых линий заключается в следующем:

Если на текущей плоскости при некотором заданном значении x соответствующее

значение y на кривой больше значения y для всех предыдущих кривых при этом значении x,

то текущая кривая видима в этой точке; в противном случае, она невидима.

Невидимые участки показаны пунктиром. Реализация данного алгоритма достаточно проста. 

Для хранения максимальных значений y при каждом значении x используется массив, длина

которого равна числу различимых точек (разрешению) по оси x  в пространстве изображения.

Значения, хранящиеся в этом массиве, представляют собой текущие значения "горизонта".

Поэтому, по мере рисования каждой очередной кривой этот горизонт всплывает.

Фактически этот алгоритм удаления невидимых линий работает каждый раз с одной линией.

Алгоритм работает хорошо до тех пор, пока, какая-нибудь очередная кривая не окажется

ниже самой первой из кривых

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

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

делается видимой, если модифицировать этот алгоритм , включив в него нижний горизонт ,

который опускается вниз по ходу работы алгоритма. Это реализуется при помощи второго

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

Этот массив содержит наименьшее значение y для каждого значения x. Алгоритм теперь

становится таким: Если на текущей плоскости при некотором заданном значении x

соответствующее значение y на кривой больше максимума или меньше минимума по y

для всех предыдущих кривых при этом x , то текущая кривая видима.

В противном случае она невидима.

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

текущую и предшествующую кривые между точкой  (x n , yn) и ( x n+k , yn+k) задается формулами:

           , где  

x = x n+k - xn

y p = (y n+k) p - (yn) p

y c = (y n+k) c - (yn)c

 и индексы C - текущая кривая (current)  P - предыдущая кривая (previous)

Алгоритм Брезенхема разложения в растр отрезка для первого октанта

Предполагается, что концы отрезка (x1 y1) и (x2 y2) не совпадает.

integer - функция преобразования в целое

x1 y1 x1 y1 - целые

е - вещественное

Инициализация переменных:

x = x1 x = x2 - x1

y = y1 y = y2 - y1

Инициализация ошибки е с поправкой на 1/2 пиксела.

Начало основного цикла.

for i = 1 to x

Plot (x, y)

while (e 0)

y = y + 1

e = e - 1

end while

x = x - 1

next i

finish.

Блок схема алгоритма

Пример: P = (0,0), P = (5,5)

Начальные условия: x = 0 x = 5 e = 1 - 1/2 = 1/2

y = 0 y = 5

Заметим, что точка растра с координатами (5,5) не активирована. Эту точку можно

активировать изменив условия цикла: for-next на 0 to x .

Активацию точки (0, 0) можно устранить, если поставить оператор Plot непосредственно

перед строкой next j.

Целочисленный алгоритм Брезенхема для первого октанта

Начальные условия: P1 = (x1, y1) P2 = (x2,y2) не совпадают, все переменные целые.

x = x1

y = y1

x = x2 - x1

y = y2 - y1

Составные кривые Фергюсона

Сегмент кривой в форме Фергюсона может быть записан через конечные точки и

касательные в них (форма Эрмита ).

r (u) = r(0)(1-3u2+2u)+r(1)(3u2- 2u)+ r'(0)(u-2u2+u)+ r'(1)(-u2+u) 0 ≤ u ≤ 1

Фергюсон обращается к обычному подходу для получения непрерывности кривизны и подбирает

r , r' , r" в точке соединения сегментов так, чтобы удовлетворялись условия a1= a2, а также r (1)(1)= r (2)(0).

Используя уравнение Эрмита определяем первую производную в общем виде:

r' (u) = r(0)(-6u+6u2)+r(1)(6u- 6u)+ r'(0)(1-4u+3u2)+ r'(1)(-2u+3u2)

Вторая производная будет иметь следующий вид:

r"(u) = r(0)(-6+12u) +r(1)(6 - 12u)+ r(0)(-4+6u) +r(1) (-2+6u)

Определим значение второй производной r"(u) для конца первого и начала второго сегмента,

подставляя соответствующие значения параметра u.

r" (1)(1)=6r (1)(0)-6 r (1)(1) +2r' (1)(0) +4r' (1)(1)

r" (2)(0)= -6r (2)(0)+6 r (2)(1) -4r' (2)(0) -2r' (2)(1)

Последние полученные выражения упрощаются с учетом условий:

r (1)(1)= r (2)(0) и r' (1)(1)= r'(0).

Можем записать.

6r (1)(0)+2 r' (1)(0) =6 r (2)(1) - 8r' (2)(0) -2r' (2)(1)

 или, разделив коэффициенты на 2, получаем

3r (1)(0)+r' (1)(0) =3 r (2)(1) - 4r' (2)(0) - r' (2)(1).

В левую часть выражения перенесем члены, содержащие первые производные,

в результате получаем следующее выражение:

r' (1)(0)+4r' (2)(0) +r' (2)(1) =3(r (2)(1) - r (1)(0))

Последнее выражение дает соотношение между касательными векторами в трех последовательных

точках и значениями радиус-векторов для рассматриваемых нами сегментов.

Если переписать последнее соотношение для любых трех точек, получаем:

t i-1+4t i +t i+1 =3(r i+1 - r i-1 ),

где

i =1, 2, 3,...n-1

Последнее выражение есть рекуррентное соотношения между касательными в

трех последовательных точках.

Если строится составная кривая Фергюсона, проходящая через точки r0 , r1 ... rn,

которая имеет касательные t0 , t1 ... tn , то достаточно знать t0 и tn, чтобы получить

систему уравнений, из которых все остальные касательные можно определить через

положения точек кривой. Приписывание этих значений касательным обеспечит непрерывность

кривизны составной кривой. Данный метод хорошо подходит для автоматического построения

кривой по определенной последовательности точек при условии, что они расположены

достаточно равномерно.

Составные кривые Безье

Сегмент кубической кривой Безье описывается выражением:

r (u)= (1 - u) 3r0+3u(1 - u) 2r1+3u2 (1 - u)r2+u3r3 0≤u≤1,

где r0 , r1 , r2 , r3 - вершины характеристического многоугольника, который аппроксимируется кривой.

Безье вводит меньше ограничений, чем Фергюсон при выборе условий непрерывности внутри сегмента.

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

заданного набора точек, подход Безье дает больше возможности непосредственно для конструирования

кривых.

Конструируется сегмент кривой r2(u2) (Рис.24), наклон и кривизна которого, должны быть

непрерывны в точке соединения с существующим сегментом r 1(u1). Так как r (0)= r 0 и r (1)= r 3,

то первое требование есть

r 3 (1) = r 0 (2)()

r (u)= -3(1 - u) 2 r0+3(1 - u) 2r1 - 6u(1 - u)r2+3u2r3

Так как

r ' (0) =3(r1 - r0) и r ' (1) =3(r3 - r2),

то для непрерывности угла наклона касательной требуется выполнение соотношения:

 ,

где a1 , a2 - суть длины касательных векторов.

В общем случае они имеют разное значение. Заметим , что если выполняются начальные условия ,

то три точки r2(1) , r3(1) = r0(2) , r1(2) должны быть коллинеарные. Далее находим:

r' (u)= -3 (1 - u) 2r0+(3(1 - u) 2+( -6 )u(1-u) )r1+(6u(1 - u)+( -3u2 ) )r2+3u2r3,

где 0≤u≤1

r "(u) =+6(1-u ) r0 +(-6(1 - u)+( -6 )(1-u)+6u )r1+(-6u +6(1 - u)-

- 6u)r2+6ur3=6(1-u ) r0 +(-12(1 - u)+6u )r1+(-12u +6(1 - u) )r2+6u r3.

Определим r"(u) для конца первого сегмента и начала второго.

r" (1)(1) =6u r1(1) -12 r2(1) +6 r3(1)=6( r1(1) - 2r2(1) + r3(1) )

r" (2)(0) = 6r0(2) -12 r1(2) +6 r2(2)=6( r0(2) - 2r1(2) + r2(2) )

Условие непрерывности кривизны в точке сопряжения , то есть непрерывность в этой точке

величины  hB = ( r' x r" ) / l r' l 3 , из предыдущих выводов можно записать:

 r"(2)(0)= l2 r"(1) + m r1'(1)(1).

Тогда соотношения (*) и (**) дают

6 ( r0(2) - r1(2) + r2(2) ) = 6 l2 (r1(1) - 2r2(1) + r3(1) ) + 3 m (r3(1) - r2(1) )

Исключим r1'(2) и r0'(r) на основании начальных условий r0(2) = r3(1).

Получаем

тогда

6 r2(2) = 6 l2 (r1(1) - 2r2(1) + r3(1) ) + 3 m (r3(1) - r2(1) )-6 r0(2) +12r1(2)

или

r2(2) = l2 (r1(1) - 2r2(1) + r3(1) ) + 1/2 m (r3(1) - r2(1)) - r0(2) +2r1(2)

r2(2)=l2 r1(1)-2r2(1) +l2 r3(1)+1/2mr3(1) -1/2 r2(1) -r3(1)+2l r3(1) -2 r2(1)+

+2r3(1) =l2 r1(1)-(2 +21/2m)r2(1) +( l2 +2l + 1+1/2m ) r3(1) .

 Тем самым r2(2) определяется через r1(1) , r2(1) , r3(1) и выбранные величины l и.

 Вершины r0(2) и r1(2) уже определены условиями непрерывности и ее наклона и поэтому сохраняя

непрерывность кривизны можно свободно выбирать лишь четвертую вершину r3(2)

характеристической ломаной сегмента r(2)(u2).

 Если вычесть r3(1) из обеих частей, то правая часть может быть выражена в виде комбинаций

(r3(1) - r2(1)) и (r2(1) - r1(1)) . Из этого следует, что точка r2(2) должна быть компланарна с точками

r1(1), r2(1), r3(1) = r0(2) и r1(2) .

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

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

Для определения формы каждого нового сегмента выбираются лишь l , m  и вершина r3.

Так как r0 , r1 , r2 в непосредственно определяются через вершины предыдущего сегмента после выбора l и.