Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_4 Трехмерное моделирование полигональными с....doc
Скачиваний:
27
Добавлен:
04.12.2018
Размер:
274.94 Кб
Скачать

3. Рисование полигональной сетки

Для рисования сетки на базе OpenGL, необходимо послать в графический конвейер список вершин каждой грани со связанной с ней нормалью (по таблице 3).

В листинге 3.1 приведена реализация рисования полигональной сетки для тетраэдра с вершинами v0v3 (табл. 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):

  • некоторая часть поглощается поверхностью и превращается в тепло;

  • некоторая часть отражается от поверхности;

  • некоторая часть проходит внутрь объекта, как в случае куска стекла.

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

Рассмотрим ту составляющую света, которая отражается от поверхности или рассеивается ею. Некоторая часть этого отраженного света движется как раз в таком направлении, чтобы достигнуть глаза, вследствие чего объект становиться виден. Количество света, попадающее в глаз, прежде всего, определяется геометрией окружения. Различают два типа отражения падающего света:

  • диффузное рассеяние происходит, когда часть падающего света слегка проникает внутрь поверхности и излучается обратно равномерно по всем направлениям. Рассеянный свет сильно взаимодействует с поверхностью, поэтому его цвет обычно зависит от природы материала, из которого сделана эта поверхность;

  • зеркальные отражения больше похожи на зеркало и имеют ярко выраженную направленность: падающий свет не поглощается объектом, а отражается прямо от его наружной поверхности. Это порождает блики, и поверхность выглядит блестящей.

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