Лабораторная работа №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. В результате должна получиться примерно следующая картина: