Прямые. Кривые. Поверхности Лекция 12. Алексей Игнатенко На прошлой лекции Текстурирование • Использование изображений для моделирования (отражающих) свойств поверхности • Виды текстурирования – bump mapping, specular mapping, environment mapping, displacement mapping, transparency mapping • Отображение текстуры • Фильтрация текстуры – Метод ближайшего соседа, Билинейная фильтрация, Мипмэппинг, Трилинейная фильтрация, Анизотропная фильтрация Композирование • Объединение двух или более независимо подготовленных изображений в одно изображение, обычно с помощью попиксельного вычисления полупрозрачности На лекции Растеризация прямой и окружности • Алгоритм Брезенхема Кривые высших порядков • Кривые Безье • B-сплайны • Рациональные сплайны Поверхности высших порядков • B-сплайн поверхности Поддержка поверхностей высших порядков в OpenGL Растеризация прямой и окружности Алгоритм Брезенхема (1/4) Отрезок, соединяющий P(x1, y1) и Q(x2, y2) y2 y1 y y1 ( x x1 ), x x1 , x2 x2 x1 Алгоритм Брезенхема (2/4) F ( x, y ) ( x x1 )dy ( y y1 )dx dx x2 x1 dy y2 y1 F(x,y) = 0 -- точка на отрезке F(x,y) < 0 -- точка выше F(x,y) > 0 -- точка ниже Точка P определена, тогда координаты срединной точки ( x p 1, y p 1 / 2) и значение функции в этой точке d F ( x p 1, y p 1 / 2) Алгоритм Брезенхема (3/4) Если d < 0, то выбирается Е и d new F ( x p 2, y p 12 ) 1 1 d new d old F ( x p 2, y p ) F ( x p 1, y p ) 2 2 E d new d old dy y 2 y1 Если d 0, то выбирается NE d new NE 3 F ( x p 2, y p ) 2 dy dx ( y2 y1 ) ( x2 x1 ) В начальной точке d start F ( x1 1, y 1 1 / 2) ( x1 1 x1 )dy ( y1 1 / 2 y1 )dx dy dx / 2 Алгоритм Брезенхема (4/4) Одна неприятность -- деление на 2 Чтобы избежать вещественной арифметики, сделаем преобразование F ' ( x, y ) 2 F ( x, y ) d ' 2d d start 2dy dx d ' 2d dstart 2dy dx 3; dNE 4; dE 10 d0 = 10 - 7 = 3 > 0 (NE) d1 = 3 - 4 = -1 < 0 (E) d2 = -1 + 10 = 9 (NE) d3 = 9 - 4 = 5 (NE) d4 = 5 - 4 = 1 (NE) d5 = 1 - 4 = -3 (E) d6 = -3 + 10 = 7 (NE) Алгоритм Брезенхема (1/4) (окружность) Неявное и явное представление x y R 2 2 2 y R x 2 2 Параметрическое представление x R cos y R sin Алгоритм Брезенхема (2/4) (окружность) Алгоритм Брезенхема (3/4) (окружность) F ( x, y) x y R 2 Для точки P c коорд. 2 2 (xp , yp ) d old F ( x p 1, y p 12 ) Для пиксела Е: 1 d new f ( x p 2, y p ) d old (2 x p 3) 2 d E (2 x p 3) Для пиксела SE: d new d old (2 x p 2 y p 5) d SE (2 x p 2 y p 5) Алгоритм Брезенхема (4/4) (окружность) В начальной точке5 (0, R) 1 1 5 2 2 F (1, R ) 1 ( R R ) R R 2 4 4 5 d0 R 4 И опять нужно исключить вещественные операции. Сделав замену h = d-1/4, получим h = 1-R. Тогда необходимо сравнивать h с -1/4, но так как приращения d – целые числа, то сравнивать можно с нулем. Кривые высших порядков Представление кривых Явное представление • y = x(t) Параметрическое представление • (x(t), y(t)), t = 0..1 Совокупность точек, интерполяция • Кривая проходит через все точки – кубическая, параболическая интерполяция • Точки определяют только направление изгиба – кривые Безье, B-сплайны Кривые высших порядков: постановка задачи Задача: построить параметрическую кривую “повторяющую” заданную ломаную (на плоскости или в пространстве) Pi , i 0,1,..., N 1. P3 P1 P2 N 1 P4 P0 Pi R2 , R3 , R4 Bi (t ) R Q(t ) Pi Bi (t ), t min t t max . i 0 - контрольные точки - базисные функции (обычно полиномы некоторой степени) Для рисования кривая обычно разбивается на M точек Q j Q(u j ), tmin u0 u1 ... uM 1 , j 0,1,..., M 1. Кривые Безье Кривые Безье. Степень кривой = N - 1 P3 P1 P2 P0 P4 Bi C Ni 1t i (1 t ) N 1i , 0 t 1 - полиномы Бернштейна Любая контрольная точка Pi оказывает влияние на форму всей кривой Для большого количества точек степень кривой окажется тоже высокой. Алгоритм построения кривой Три контрольные точки Три контрольные точки (2) Четыре контрольные точки (1) Четыре контрольные точки (2) Задача (1) Ломаная Безье задана тремя точками (0, 0), (0, 9), (18, 0). Определите координаты точки на кривой Безье при t = 1/3. Задача (2) Ломаная Безье задана тремя точками (0, 0), (0, 9), (18, 0). Определите координаты точки на кривой Безье при t = 1/3. Кривые высших порядков: B-сплайны Задача: построить параметрическую кривую, форма которой изменяется локально при изменении одной из контрольных точек. N 1 Q (t ) Pi Bi , p (t ), tmin t tmax , 2 p N 1. i 0 p - степень B-сплайна. Базисные функции рассчитываются по рекуррентным формулам Кокса-де Бура. 1, ti t ti 1 , Bi ,0 (t ) , i 0,1,..., N p. 0, в противном случае. Bi ,k (t ) (t ti ) Bi ,k 1 (t ) ti k 1 ti (ti k t ) Bi 1,k 1 (t ) ti k ti 1 , i 0,1,..., N p k. Рациональные сплайны Рациональный сплайн является проекцией обычного сплайна из пространства более высокой размерности (см. однородные координаты) [ x, y, z, w] [ x / w, y / w, z / w] [ x' , y' , z ' ] N 1 Q(t ) w P'B i 0 N 1 i i i, p w B i 0 i i, p (t ) . (t ) Формулы для пересчета нормалей оказываются неверными. w > 0 является веcом вершины. Чем больше вес, тем большее влияние вершина оказывает на форму кривой. G0, G1 - геометрическая непрерывность Два сегмента прямой называются Gk-непрерывными в точке соединения тогда и только тогда, когда все векторы i-x (i <= k) производных имеют совпадающие направления. Задача Заданы два звена сплайна a(t) = (t, t2 + 1) и b = (2t + 1, t3 + 4t + 2), 0 <= t <= 1. Обеспечивается ли C0, C1, G1 непрерывность в точке соединения a(1), b(0)? Поверхности высших порядков Постановка задачи B-Spline поверхности Поверхность строится на основе двух наборов базисных функций Q(u, v) N1 1 N 2 1 B i, p i 0 j 0 (u ) B j , p (v) Pij . Q(u, v) N1 1 N 2 1 dBi , p (u ) B j , p (v) Pij . u du i 0 j 0 dB j , p (v) Q(u, v) N1 1 N 2 1 Bi , p (u ) Pij . v dv i 0 j 0 Край поверхности является В-сплайном, который определяют граничные контрольные точки Q(0, v) N1 1 B i 0 i, p N 2 1 (0) B j , p (v) Pij j 0 N 2 1 B j 0 j, p (v) P0, j . Поддержка в OpenGL Рисование геометрических объектов (1/2) Перед началом рисования необходимо создать объект GLUQuadricObj, хранящий режимы рисования объектов GLU GLUquadricObj *obj = gluNewQuadric(); Для управления режимами рисования предназначены следующие функции: gluQuadricDrawStyle Каркасный или сплошной режим рисования gluQuadricOrientation Направление нормалей gluQuadricNormals Режим расчета нормалей gluQuadricTexture Рассчитывать или нет текстурные координаты gluQuadricNormals(obj, GL_FLAT); Рисование геометрических объектов (2/2) partial disk disk sphere Для рисования объектов предназначены функции gluSphere, gluCylinder, gluDisk и gluPartialDisk. gluSphere(obj, 1.0, 20, 10); Когда объект не нужен, память можно освободить gluDeleteQuadric(obj); Рисование кривых и поверхностей NURBS (1/2) Перед началом рисования кривой или поверхности NURBS необходимо создать объект для хранения режимов построения NURBS GLUnurbsObj *obj = new gluNewNurbsRenderer(); При помощи функции gluNurbsProperty можно задать режим разбиения, режим рисования и режимы отсечения кривых и поверхностей. Предусмотрены следующие режимы разбиения кривых и поверхностей: 1. Постоянный шаг по параметрам u и v 2. Адаптивное разбиение в зависимости от длины кривой/площади поверхности на экране. 3. Адаптивное разбиение в зависимости от ошибки аппроксимации Рисование кривых и поверхностей NURBS (2/2) Рисование кривой NURBS Между командами gluBeginCurve и gluEndCurve вызываются команды gluNurbsCurve для задания массивов контрольных точек, а также нормалей, цветов и текстурных координат вершин. Рисование поверхности NURBS Между командами gluBeginSurface и gluEndSurface вызываются команды gluNurbsSurface для задания массивов контрольных точек, а также нормалей, цветов и текстурных координат вершин. Чайник Юта (1) Чайник Юта (2) Итоги Растеризация прямой и окружности • Алгоритм Брезенхема Кривые высших порядков • Кривые Безье • B-сплайны • Рациональные сплайны Поверхности высших порядков • B-сплайн поверхности