Трехмерное моделирование полигональными сетками 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Трехмерное моделирование полигональными сетками



ЛАБОРАТОРНАЯ РАБОТА № 4

ТРЕХМЕРНОЕ МОДЕЛИРОВАНИЕ ПОЛИГОНАЛЬНЫМИ СЕТКАМИ

 


Задания для самостоятельного выполнения

 

I.

1) Создать приложение на основе библиотеки (GLUT) OpenGL Utility Toolkit, которое открывает окно для рисования геометрического объекта. При этом режим дисплея использует двойную буферизацию, режим RGBA и буфер глубины.

2) Установить перспективную проекцию с углом обзора 60о.

3) Расположить наблюдателя в позицию (0, 3, 3), направленного в точку (0, 0, 0) и вектором направления вверх (0, 1, 0).

4) Выполнить рисование тетраэдра, используя пример из листинга 1.

5) Создать локальный источник света, используя пример из листинга 2.

6) Осуществить вращение геометрического объекта (источника света) вокруг оси Y, при помощи обработчика отсутствия событий. При нажатии на клавишу ‘o’(‘l’) – вращается объект (источник света).

7) Осуществить визуализацию лицевых (нелицевых) граней. При нажатии на клавишу ‘f’(‘b’) – визуализируются лицевые (нелицевые) грани.

 

II.

1) Построить полигональную сетку геометрического объекта, который указан в варианте задания. Для этого необходимо заполнить таблицы списков: вершин, нормалей и граней.

2) Вместо рисования тетраэдра осуществить рисование геометрического объекта по заполненным таблицам.

3) Установить для лицевых граней объекта свойства материала, коэффициенты которого приведены в соответствующем варианте задания.

 


Варианты заданий:

                                                          

1)                                                   (материал - олово)

ambient = (0.10588, 0.058824, 0.113725, 1)

diffuse = (0.427451, 0.470588, 0.541176, 1)

specular = (0.3333, 0.3333, 0.521569, 1)

shininess = (9.84615)

 

 

2)                                              (материал - хром)

ambient = (0.25, 0.25, 0.25, 1)

diffuse = (0.4, 0.4, 0.4, 1)

specular = (0.774597, 0.774597, 0.774597, 1)

shininess = (76.8)

 

                                                          

3)                                                   (материал - бронза)

ambient = (0.2125, 0.1275, 0.054, 1)

diffuse = (0.714, 0.4284, 0.18144, 1)

specular = (0.393548, 0.271906, 0.166721, 1)

shininess = (25.6)

 

4)                                                   (материал - серебро)

ambient = (0.19225, 0.19225, 0.19225, 1)

diffuse = (0.50754, 0.50754, 0.50754, 1)

specular = (0.508273, 0.508273, 0.508273, 1)

shininess = (51.2)

 

 


5)                                                   (материал - золото)

ambient = (0.24725, 0.1995, 0.0745, 1)

diffuse = (0.75164, 0.60648, 0.22648, 1)

specular = (0.628281, 0.555802, 0.366065, 1)

shininess = (51.2)

 

 

6)                                                   (материал - медь)

ambient = (0.19125, 0.0735, 0.0225, 1)

diffuse = (0.7038, 0.27048, 0.0828, 1)

specular = (0.256777, 0.137622, 0.086014, 1)

shininess = (12.8)

 


7)                                                   (материал - олово)

ambient = (0.10588, 0.058824, 0.113725, 1)

diffuse = (0.427451, 0.470588, 0.541176, 1)

specular = (0.3333, 0.3333, 0.521569, 1)

shininess = (9.84615)

 

 

8)                                              (материал - хром)

ambient = (0.25, 0.25, 0.25, 1)

diffuse = (0.4, 0.4, 0.4, 1)

specular = (0.774597, 0.774597, 0.774597, 1)

shininess = (76.8)

 

                                                          

9)                                                   (материал - бронза)

ambient = (0.2125, 0.1275, 0.054, 1)

diffuse = (0.714, 0.4284, 0.18144, 1)

specular = (0.393548, 0.271906, 0.166721, 1)

shininess = (25.6)

 

10)                                                 (материал - серебро)

ambient = (0.19225, 0.19225, 0.19225, 1)

diffuse = (0.50754, 0.50754, 0.50754, 1)

specular = (0.508273, 0.508273, 0.508273, 1)

shininess = (51.2)

 

 


11)                                                 (материал - золото)

ambient = (0.24725, 0.1995, 0.0745, 1)

diffuse = (0.75164, 0.60648, 0.22648, 1)

specular = (0.628281, 0.555802, 0.366065, 1)

shininess = (51.2)

 

 

12)                                                 (материал - медь)

ambient = (0.19125, 0.0735, 0.0225, 1)

diffuse = (0.7038, 0.27048, 0.0828, 1)

specular = (0.256777, 0.137622, 0.086014, 1)

shininess = (12.8)

 

 


ПОНЯТИЕ полигональнОЙ сетки

 

Полигональные сетки являются просто набором полигонов, или «граней», которые в совокупности формируют «оболочку» объекта. Сетки в графике являются стандартным способом представления широкого класса форм. Популярность полигональных сеток в графике основана на простоте использования полигонов: их легко представлять (последовательностью вершин) и преобразовывать, у них простые свойства (единственный нормальный вектор, четко определяемые внутренняя и внешняя области и т.д.); кроме того, их просто рисовать.

Многие системы визуализации, в том числе OpenGL, основаны на изображении объектов посредством рисования последовательности полигонов. Каждая грань полигона посылается в графический конвейер, где ее вершины подвергаются различным преобразованиям, и та часть грани, которая осталась после отсечения, закрашивается или «затеняется» и демонстрируется на устройстве отображения.

Полигональная сетка задается списком полигонов и информацией о направлении, куда «обращен» каждый полигон. Информация о направлении часто задается в виде нормали к плоскости его грани. Эта информация используется при закрашивании объекта для определения того, сколько света от источника рассеивается на этой грани.

 

Создание источника света

OpenGL позволяет задать до восьми источников с именами GL_LIGHT0, GL_LIGHT1 и т.д. Каждый источник обладает различными свойствами и должен быть задействован (включен). У каждого его свойства имеется значение по умолчанию. Например, для создания источника, расположенного в точке (1, 2, 2) в мировых координатах, следует выполнить следующий код:

Листинг 2. Пример создания источника света

GLfloat myLightPosition[] = {1.0, 2.0, 2.0, 1.0};

glLightfv(GL_LIGHT0, GL_POSITION, myLightPosition);

glEnable(GL_LIGHTING); // Включение расчета освещенности

glEnable(GL_LIGHT0); // включаем этот конкретный источник

Массив myLightPosition[] (имя можно использовать любое) определяет положение источника света и передается в функцию glLightfv() вместе с именем источника GL_LIGHT0, для того чтобы связать его с конкретным источником, обозначенным именем GL_LIGHT0.

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

Тогда мы имеем

(x, y, z, 1): локальный источник света в положении (x, y, z)  и

(x, y, z, 0): вектор к бесконечно удалённому источнику света в направлении (x, y, z).

Бесконечно удаленные источники света часто называют «направленными». Существуют определенные вычислительные преимущества в использовании направленных источников света, поскольку направление при вычислении диффузного и зеркального отражений одинаково для всех вершин данной сцены. Однако направленные источники света не всегда являются наилучшим выбором: некоторые визуальные эффекты достигаются только тогда, когда источник света расположен близко к объекту.

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

С помощью приведенного ниже кода определяются массивы для хранения цветов, испускаемых источниками света. Эти массивы затем передаются в функцию glLightfv():

Листинг 3. Пример задания цветов, испускаемых источником света

GLfloat myAmbient[] = {0.2, 0.4, 0.6, 1.0};

GLfloat myDiffuse[] = {0.8, 0.9, 0.5, 1.0};

GLfloat mySpecular[] = {1.0, 0.8, 1.0, 1.0};

glLightfv(GL_LIGHT0, GL_AMBIENT, myAmbient);

glLightfv(GL_LIGHT0, GL_DIFFUSE, myDiffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, mySpecular);

Цвета задаются в так называемом формате RGBA, что означает: R ed (красный), G reen (зеленый), B lue (синий) и A lpha (альфа). Величина alpha иногда используется для смешения двух цветов на экране. Для наших целей здесь alpha = 1.0.

Источники света имеют различные значения по умолчанию.

Для всех источников:

default ambient = (0, 0, 0, 1) фоновый по умолчанию.

Наименьшая яркость – черный.

Для источника света LIGHT0:

default diffuse = (1, 1, 1, 1) диффузный по умолчанию.

Наибольшая яркость – белый.

default specular = (1, 1, 1, 1) зеркальный по умолчанию.

Для других источников света значения диффузного и зеркального компонентов по умолчанию установлены в черный цвет.

 

Прожекторы

Источники света по умолчанию являются точечными источниками. Это означает, что они излучают свет равномерно по всем направлениям. Однако OpenGL позволяет превратить их в прожекторы, так чтобы они излучали свет в ограниченном числе направлений. На рис. 5.1 показан прожектор, нацеленный в направлении d c «углом пропускания» («cutoff angle») α. Угол пропускания α может принимать значения диапазона [0, 90].

В точках, лежащих вне конуса пропускания, свет не виден вообще. Для таких вершин, как Р, которые лежат внутри этого конуса, количество света, достигающего точки Р, пропорционально множителю cosε(β), где β – угол между вектором d и прямой, соединяющей источник с точкой Р. Показатель степени ε лежит в диапазоне [0, 128] и выбирается пользователем так, чтобы обеспечить нужное уменьшение интенсивности света в зависимости от угла.

Параметры прожектора устанавливаются следующим образом: с помощью функции glLightf(…) задается его единственный параметр, а с помощью функции glLightfv(…) – вектор:

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); // угол пропускания равен 45о

glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 4.0); // ε = 4.0

GLfloat myDirection[] = {2.0, 1.0, -4.0}; // направление прожектора

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, myDirection);

По умолчанию установлены следующие значения этих параметров: d = (0, 0, -1), α = 180о; ε = 0, что соответствует действующему во всех направлениях точечному источнику света.

 

ЛАБОРАТОРНАЯ РАБОТА № 4

ТРЕХМЕРНОЕ МОДЕЛИРОВАНИЕ ПОЛИГОНАЛЬНЫМИ СЕТКАМИ

 


Задания для самостоятельного выполнения

 

I.

1) Создать приложение на основе библиотеки (GLUT) OpenGL Utility Toolkit, которое открывает окно для рисования геометрического объекта. При этом режим дисплея использует двойную буферизацию, режим RGBA и буфер глубины.

2) Установить перспективную проекцию с углом обзора 60о.

3) Расположить наблюдателя в позицию (0, 3, 3), направленного в точку (0, 0, 0) и вектором направления вверх (0, 1, 0).

4) Выполнить рисование тетраэдра, используя пример из листинга 1.

5) Создать локальный источник света, используя пример из листинга 2.

6) Осуществить вращение геометрического объекта (источника света) вокруг оси Y, при помощи обработчика отсутствия событий. При нажатии на клавишу ‘o’(‘l’) – вращается объект (источник света).

7) Осуществить визуализацию лицевых (нелицевых) граней. При нажатии на клавишу ‘f’(‘b’) – визуализируются лицевые (нелицевые) грани.

 

II.

1) Построить полигональную сетку геометрического объекта, который указан в варианте задания. Для этого необходимо заполнить таблицы списков: вершин, нормалей и граней.

2) Вместо рисования тетраэдра осуществить рисование геометрического объекта по заполненным таблицам.

3) Установить для лицевых граней объекта свойства материала, коэффициенты которого приведены в соответствующем варианте задания.

 


Варианты заданий:

                                                          

1)                                                   (материал - олово)

ambient = (0.10588, 0.058824, 0.113725, 1)

diffuse = (0.427451, 0.470588, 0.541176, 1)

specular = (0.3333, 0.3333, 0.521569, 1)

shininess = (9.84615)

 

 

2)                                              (материал - хром)

ambient = (0.25, 0.25, 0.25, 1)

diffuse = (0.4, 0.4, 0.4, 1)

specular = (0.774597, 0.774597, 0.774597, 1)

shininess = (76.8)

 

                                                          

3)                                                   (материал - бронза)

ambient = (0.2125, 0.1275, 0.054, 1)

diffuse = (0.714, 0.4284, 0.18144, 1)

specular = (0.393548, 0.271906, 0.166721, 1)

shininess = (25.6)

 

4)                                                   (материал - серебро)

ambient = (0.19225, 0.19225, 0.19225, 1)

diffuse = (0.50754, 0.50754, 0.50754, 1)

specular = (0.508273, 0.508273, 0.508273, 1)

shininess = (51.2)

 

 


5)                                                   (материал - золото)

ambient = (0.24725, 0.1995, 0.0745, 1)

diffuse = (0.75164, 0.60648, 0.22648, 1)

specular = (0.628281, 0.555802, 0.366065, 1)

shininess = (51.2)

 

 

6)                                                   (материал - медь)

ambient = (0.19125, 0.0735, 0.0225, 1)

diffuse = (0.7038, 0.27048, 0.0828, 1)

specular = (0.256777, 0.137622, 0.086014, 1)

shininess = (12.8)

 


7)                                                   (материал - олово)

ambient = (0.10588, 0.058824, 0.113725, 1)

diffuse = (0.427451, 0.470588, 0.541176, 1)

specular = (0.3333, 0.3333, 0.521569, 1)

shininess = (9.84615)

 

 

8)                                              (материал - хром)

ambient = (0.25, 0.25, 0.25, 1)

diffuse = (0.4, 0.4, 0.4, 1)

specular = (0.774597, 0.774597, 0.774597, 1)

shininess = (76.8)

 

                                                          

9)                                                   (материал - бронза)

ambient = (0.2125, 0.1275, 0.054, 1)

diffuse = (0.714, 0.4284, 0.18144, 1)

specular = (0.393548, 0.271906, 0.166721, 1)

shininess = (25.6)

 

10)                                                 (материал - серебро)

ambient = (0.19225, 0.19225, 0.19225, 1)

diffuse = (0.50754, 0.50754, 0.50754, 1)

specular = (0.508273, 0.508273, 0.508273, 1)

shininess = (51.2)

 

 


11)                                                 (материал - золото)

ambient = (0.24725, 0.1995, 0.0745, 1)

diffuse = (0.75164, 0.60648, 0.22648, 1)

specular = (0.628281, 0.555802, 0.366065, 1)

shininess = (51.2)

 

 

12)                                                 (материал - медь)

ambient = (0.19125, 0.0735, 0.0225, 1)

diffuse = (0.7038, 0.27048, 0.0828, 1)

specular = (0.256777, 0.137622, 0.086014, 1)

shininess = (12.8)

 

 


ПОНЯТИЕ полигональнОЙ сетки

 

Полигональные сетки являются просто набором полигонов, или «граней», которые в совокупности формируют «оболочку» объекта. Сетки в графике являются стандартным способом представления широкого класса форм. Популярность полигональных сеток в графике основана на простоте использования полигонов: их легко представлять (последовательностью вершин) и преобразовывать, у них простые свойства (единственный нормальный вектор, четко определяемые внутренняя и внешняя области и т.д.); кроме того, их просто рисовать.

Многие системы визуализации, в том числе OpenGL, основаны на изображении объектов посредством рисования последовательности полигонов. Каждая грань полигона посылается в графический конвейер, где ее вершины подвергаются различным преобразованиям, и та часть грани, которая осталась после отсечения, закрашивается или «затеняется» и демонстрируется на устройстве отображения.

Полигональная сетка задается списком полигонов и информацией о направлении, куда «обращен» каждый полигон. Информация о направлении часто задается в виде нормали к плоскости его грани. Эта информация используется при закрашивании объекта для определения того, сколько света от источника рассеивается на этой грани.

 



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 61; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.38.142 (0.078 с.)