Лабораторная работа №3 «Функции OpenGL аппроксимации сплайнами»

advertisement
Лабораторная работа №3 «Функции OpenGL аппроксимации сплайнами»
Цель работы: изучение функций OpenGL аппроксимации сплайнами.
Задание: применить различные функции OpenGL для аппроксимации кривых и поверхностей.
Продолжительность: 2 часа.
Исходные данные: шаблоны программы (файлы 3_1.cpp и 3_2.cpp), написанные на языке С++ с
применением библиотеки GLUT.
Описание. Шаблон 3_1.cpp составлен на базе лабораторной работы №1 и предназначен для
изучения аппроксимации кривых. Шаблон 3_2.cpp составлен на базе лабораторной работы №2 и
предназначен для изучения аппроксимации поверхностей. Поэтому для выполнения данной
лабораторной работы потребуется также использовать описания к лабораторным работам №1 и
№2.
Примечание. В шаблонах комментарии, написанные прописными буквами, подсказывают места, в которых
нужно добавить свой код.
Последовательность выполнения работы (шаблон 3_1.cpp, аппроксимация кривых):
1. Подключить библиотеку GLUT (см. файл README-win32.txt) в папке OpenGL.
2. В среде разработки (например, Visual Studio) создать пустое консольное приложение,
скопировать в папку проекта файл шаблона программы 3_1.cpp и добавить этот файл в
проект.
3. Скомпилировать проект, убедиться, что описанные функции для создания контрольных
точек и меню работают.
4. Начнем изучение с функций OpenGL сплайнов Безье. Для них потребуется создать
глобальные (видные во всех функциях) переменные:

Указатель на обычный динамический массив контрольных точек *ctrlPts типа
GLfloat.

Рекомендуется для созданного массива создать переменную-индекс (например, j),
отвечающий за перебор элементов данного массива в циклах (чтобы не создавать
ее в каждой функции).
5. В функции calculateSplines проверять – если массив контрольных точек уже был создан
(указатель не равен NULL), то очистить его. Далее нужно в динамической памяти создать
новый массив контрольных точек. Количество созданных при помощи мышки контрольных
точек хранится в программе в переменной nPts. Заполнить созданный массив контрольных
точек координатами x,y,z из элементов списка i.
Вызвать функции построения сплайна Безье. Параметры tMin и tMax можно выбрать
произвольным образом (например, 0 и 1 соответственно). Инициализировать сетку
(равномерный набор) для визуализации кривой Безье с равномерным шагом по
параметрической координате.
6. В функции init инициализировать указатель на массив контрольных точек ctrlPts значением
NULL.
7. В функции displayFnc отобразить сгенерированный сплайн.
Для визуализации сначала попробовать использовать функции glEvalCoord1, вызывая их в
цикле для разных значений параметра, изменяемого от tMin до tMax.
Затем, закомментировав вызов этих функций, попробовать использовать функцию
glEvalMesh1 для определенного ранее равномерного набора значений параметров.
8. В результате должна получиться примерно следующая картина:
Точки сплайна соединяются красными отрезками. Шаг равномерный (100 точек).
Примечание. При количестве контрольных больше 8 функции OpenGL аппроксимации кривыми
Безье перестают работать.
9. Посмотрим теперь, как работают функции OpenGL аппроксимации кривых B-сплайнов. Для
них потребуется создать глобальные переменные:

Указатель на новый NURBS-объект.

Порядок полинома B-сплайна (q, degParam).

Число элементов вектора узлов (nknots).

Указатель на обычный динамический массив – вектор узлов knotVector типа
GLfloat.
10. В функции calculateSplines инициализировать переменные, необходимые для построения
B-сплайна. Порядок полинома degParam можно рассчитать через определенную в
программе переменную – степень полинома degree. Значение по умолчанию для степени
полинома = 3 (кубические B-спланы). Число элементов вектора узлов определяется через
число контрольных точек nPts и порядок полинома degParam (q). Если вектор узлов уже
был создан (указатель не равен NULL), то очистить его. Далее нужно в динамической
памяти создать новый вектор узлов. Инициализировать созданный вектор узлов любым из
способов (равномерный, открытый или неравномерный сплайн).
Для получения максимального балла за лабораторную работу рекомендуется протестировать
построение открытого B-сплайна.
11. В функции init инициализировать указатель на новый NURBS объект.
12. Инициализировать указатель на вектор узлов knotVector значением NULL
13. В функции displayFnc сгенерировать и отобразить B-сплайн.
14. В результате должна получиться примерно следующая картина:
Последовательность выполнения работы (шаблон 3_2.cpp, аппроксимация поверхностей):
1. Подключить библиотеку GLUT (см. файл README-win32.txt) в папке OpenGL.
2. В среде разработки (например, Visual Studio) создать пустое консольное приложение,
скопировать в папку проекта файл шаблона программы 3_2.cpp и добавить этот файл в
проект.
3. Скомпилировать проект, убедиться, что описанные функции для создания контрольных
точек и меню работают.
4. Рассмотрим функции OpenGL поверхностых сплайнов Безье. В функции
calculateSurfaceSplines вызвать функции построения сплайна Безье. Параметры tMin, tMax,
tauMin и tauMax можно выбрать произвольным образом. Инициализировать сетку
(равномерный набор) для визуализации поверхности Безье с равномерным шагом по
каждой параметрической координате.
5. В функции displayFnc отобразить сгенерированный поверхностный сплайн.
Для визуализации сначала попробовать использовать функции glEvalCoord2, вызывая их в
двойном цикле для разных значений параметров, изменяемых от tMin до tMax и от tauMin
до tauMax.
Затем, закомментировав вызов этих функций, попробовать использовать функцию
glEvalMesh2 для определенного ранее равномерного набора значений параметров.
6. В результате должна получиться примерно следующая картина:
7. Точки сплайна соединяются красными отрезками. Шаг вдоль каждого направления
равномерный (20 точек).
Примечание. При количестве контрольных больше 8 вдоль любого из параметрических
направлений функции OpenGL аппроксимации поверхностями Безье перестают работать.
8. Перейдем теперь к рассмотрению функций OpenGL аппроксимации поверхностными
B-сплайнами. Механизм создания и инициализации переменных, а также генерации
поверхностного B-сплайна полностью аналогичен случаю B-сплайновых кривых с учетом
добавления еще одного параметрического направления.
9. В результате должна получиться примерно следующая картина:
Download