- •Лекция 1 Основные понятия OpenGl
- •1.2 Однородные координаты и матрицы
- •1.3 Поворот точки вокруг прямой заданной точкой а(a,b,c) и направляющим вектором e(l,m,n), , на угол φ.
- •1.4 Система координат
- •1.5 Вершины
- •Лекция 2 Освещение объектов
- •2.1Основные понятия
- •2.2 Задание цвета объекта
- •2.3.1 Свойства диффузного отражения
- •2.3.2 Свойства зеркального отражения
- •Лекция 3
- •3.1 Контекст воспроизведения
- •2.3 Освещение объектов
- •3.2 Стандартные функции библиотеки OpenGl
- •3.3 Функции библиотеки glu
- •3.4 Рекомендации по созданию графических приложений
- •Лекция 4
- •Свойства материалов
- •Установка источников света
- •Модель освещения
- •Смешение цветов
- •4.5 Задание теста глубины
- •Лекция 5 Наложение текстуры на объект
- •Задание параметров текстуры
- •Задание параметров текстуры
- •Взаимодействие текстуры с объектом
- •Привязка координат текстуры к объекту
- •Подготовка текстуры из bmp файла, для случая, когда размеры файла известны
- •Пример инициализации двухмерной текстуры
- •Лекция 6. Буфер трафарета
- •6.1 Тест трафарета
- •6.2 Логические операции с графическими объектами
- •6.2.1 Описание метода вычитания графических объектов
- •Лекция 7. Сплайновые поверхности
- •7.1 Кривые Безье
- •7.2 Отображение кривых Безье в OpenGl
- •7.3 Отображение поверхностей Безье в OpenGl
- •Лекция 8. Выбор графических объектов на экране
- •8.1 Идея метода
- •Лекция 9. Экспорт трехмерных изображений из 3d Studio max
- •9.1 Формат файла gms
- •9.2 Импортирование изображений объектов в программу
- •9.3 Загрузка файла формата gms в Delphi
- •Лекция 10 Вспомогательные функции
- •10.1.Работа с таймером
- •10.2 Обработка нажатия клавиши
- •10.3 Вывод текста на экран
- •Литература
Лекция 7. Сплайновые поверхности
7.1 Кривые Безье
Для изображения гладких линий или поверхностей в компьютерной графике используются сплайновые кривые (Кривая Безье).
Кривая Безье,
описываемая уравнением
(7.1)
где
- коэффициенты в разложении бинома
Ньютона (число сочетаний из m
по i);
Vi – вершины, называемые контрольными точками кривой Безье, а ломаная прямая соединяющая вершины- контрольной линией;
t – параметр определяющий длину линии от вершины V0 до Vm;
m – число вершин
Из уравнения (7.1) видно , что кривая Безье обладает следующими свойствами:
кривая Безье- гладкая;
начинается в точке V0 и кончается в точке Vm ;
отрезки V0 V1 и Vm-1 Vm контрольной линии являются касательными к кривой;
параметр t определяет точку на кривой;
кривая Безье целиком лежит в выпуклой оболочке порождаемой массивом вершин
.
Рис. 7.1 Кубическая парабола Безье (m=3).
.
И
з
элементарных бикубических поверхностей
можно строить составные поверхности.
Для обеспечения гладкости составных
поверхностей, смежные наборы контрольных
точек должны иметь общую контрольную
линию.
Линия, составленная из фрагментов, будет гладкой, если контрольные точки V31 и V02 лежат на одной прямо. (Это требование является следствием свойства кривых Безье: крайние ребра являются касательными к кривой).
Порядок следования контрольных точек существенно влияет на вид кривой.
7.2 Отображение кривых Безье в OpenGl
В OpenGL отображение кривых Безье осуществляется следующим образом:
в глобальных переменных задается массив контрольных точек
ctrlpoints : Array [0..3, 0..2] of GLfloat = (( -4.0, -4.0, 0.0), (-2.0, 4.0, 0.0),(2.0, -4.0, 0.0), (4.0, 4.0, 0.0));
в обработчике создания формы FormCreate или там, где контрольные точки могут изменять своё значение, задаётся одномерный вычислитель
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, @ctrlpoints);
где
GL_MAP1_VERTEX_3 – символьная константа соответствующая случаю, когда каждая контрольная точка представляет собой набор трёх чисел;
Второй и третий
параметр соответствуют диапазону
изменения параметр
;
Четвёртый параметр 3- размерность вектора, определяющего контрольную точку;
Пятый параметр 4-число контрольных точек;
Шестой параметр @ctrlpoints – адрес массива контрольных точек;
Для построения сплайновой кривой в процедуре FormPaint используется стандартная команда OpenGL вывода точек или линий, но место векторов задаётся команда glEvalCoord1f.
Например.
procedure TfrmGL.FormPaint(Sender: TObject);
var
i : GLint;
begin
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINE_STRIP);
For i := 0 to 30 do
glEvalCoord1f(i / 30.0);
glEnd;
SwapBuffers(DC);
end;
В этой процедуре команда glEvalCoord1f(i / 30.0); выводит сплайновую кривую, аппроксимировав её тридцатью отрезками (то есть последовательно выводит тридцать отрезков по всему диапазону t от 0 до 1 c шагом 1/30).
