
- •Г.М. Набережнов, н.Н. Максимов трехмерное моделирование полигональными сетками
- •Казань 2008 Задания для самостоятельного выполнения
- •1. Понятие полигональнОй сетки
- •2. Построение полигональной сетки
- •3. Рисование полигональной сетки
- •4. Введение в модели закрашивания
- •5. Использование источников света в OpenGl
- •5.1. Создание источника света
- •5.2. Прожекторы
- •5.3. Ослабление света с расстоянием
- •5.4. Перемещение источников света
- •6. Работа со свойствами материалов в OpenGl
3. Рисование полигональной сетки
Для рисования сетки на базе OpenGL, необходимо послать в графический конвейер список вершин каждой грани со связанной с ней нормалью (по таблице 3).
В листинге 3.1 приведена реализация рисования полигональной сетки для тетраэдра с вершинами v0 – v3 (табл. 2.1). С каждой третьей вершиной связана новая нормаль (табл. 2).
Вызов подпрограммы glNormal3f(nx, ny, nz) устанавливает «текущую нормаль», которая применяется ко всем вершинам, последовательно пересылаемым в конвейер с помощью glVertex3f(vx, vy, vz) (рис. 3.1). Эта нормаль остается текущей вплоть до ее изменения при следующем вызове glNormal3f(…).
Если векторы не нормированы, то посредством выполнения процедуры glEnable(GL_NORMALIZE) можно указать, чтобы OpenGL автоматически нормировал все нормальные векторы.
Листинг 1. Рисование сетки с использованием OpenGL
// грань f0
glBegin(GL_POLYGON);
glNormal3f(0.577, 0.577, 0.577);
glVertex3f(1, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(0, 0, 1);
glEnd();
// грань f1
glBegin(GL_POLYGON);
glNormal3f(0, 0, -1);
glVertex3f(0, 0, 0);
glVertex3f(0, 1, 0);
glVertex3f(1, 0, 0);
glEnd();
// грань f2
glBegin(GL_POLYGON);
glNormal3f(-1, 0, 0);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, 1);
glVertex3f(0, 1, 0);
glEnd();
// грань f3
glBegin(GL_POLYGON);
glNormal3f(0, -1, 0);
glVertex3f(1, 0, 0);
glVertex3f(0, 0, 1);
glVertex3f(0, 0, 0);
glEnd();
4. Введение в модели закрашивания
Механизм отражения света от текущей поверхности очень сложен и зависит от многих факторов.
В модели закрашивания, часто используемой в графике, предполагается, что объекты сцены освещаются двумя типами источников: точечными источниками света и фоновым светом (ambient light). Эти источники света «сверкают» на различных поверхностях объектов, и падающий свет взаимодействует с поверхностью одним из трех возможных способов (рис. 4.1):
-
некоторая часть поглощается поверхностью и превращается в тепло;
-
некоторая часть отражается от поверхности;
-
некоторая часть проходит внутрь объекта, как в случае куска стекла.
Если весь падающий свет поглощается, то данный объект воспринимается как черный, поэтому его называют абсолютно черным телом. Если весь свет проходит сквозь объект, то он виден только в результате эффекта рефракции.
Рассмотрим ту составляющую света, которая отражается от поверхности или рассеивается ею. Некоторая часть этого отраженного света движется как раз в таком направлении, чтобы достигнуть глаза, вследствие чего объект становиться виден. Количество света, попадающее в глаз, прежде всего, определяется геометрией окружения. Различают два типа отражения падающего света:
-
диффузное рассеяние происходит, когда часть падающего света слегка проникает внутрь поверхности и излучается обратно равномерно по всем направлениям. Рассеянный свет сильно взаимодействует с поверхностью, поэтому его цвет обычно зависит от природы материала, из которого сделана эта поверхность;
-
зеркальные отражения больше похожи на зеркало и имеют ярко выраженную направленность: падающий свет не поглощается объектом, а отражается прямо от его наружной поверхности. Это порождает блики, и поверхность выглядит блестящей.
Считается, что суммарное количество света, отраженного от поверхности в определенном направлении, складывается из диффузного и зеркального компонентов.