ЛАБОРАТОРНАЯ РАБОТА № 12
Освещение  и  тени.
// Цветовые  модели  и  эффекты //
 
1. Цель работы
 
1) Освоить программирование реалистичных изображений трехмерных объектов с использованием алгоритмов построения теней и различного вида цветовых эффектов.
2) Разработать программу в среде  C++Builder, для демонстрации трехмерной геометрической фигуры, собственной и падающей теней этой фигуры и различных способов её освещения.
// 3) Освоить методы формирования цветовых моделей и эффектов. //
 
2.  Постановка задачи
 
2.1. В проект, разработанный для лабораторных работ по 3D-графике добавить новый модуль с формой Form7.
2.2. В графическом окне Form7 изобразить:
- координатную плоскость Y=0. Необходимо выполнить заливку поверхности светлым тоном;
- источник искусственного освещения;
- фигуру, заданную по варианту, из таблицы 1. Фигура должна быть прорисована в режиме аксонометрического проецирования с удаленными невидимыми гранями и закрашенными видимыми поверхностями (разными цветами);
- тени, собственную и падающую, на плоскость Y=0;
2.3. Используя средства управления, расположенные на панели и на клавиатуре, продемонстрировать следующее:
1) Вращение координатной плоскости Y=0 и всех объектов сцены вместе с ней в двух плоскостях;
2) Изменение масштаба фигуры;
3) Свободное перемещение фигуры по трем направлениям в пределах объема сцены;
4) Вращение фигуры в двух плоскостях;
5) Изменение положения источника света в трех направлениях;
6) Изменение расположения собственной тени на поверхности фигуры и положения падающей тени на плоскости Y=0 при изменении положения источника света или положения самой фигуры.
 
Таблица 1
Вар.
Тип
фигуры
Тип
источника света
Алгоритм
построения теней
1
прямоугольный параллелепипед
искусственный
первый способ
2
косоугольный параллелепипед
естественный
первый способ
3
трехугольная пирамида (тетраэдр)
искусственный
второй способ
4
четырехугольная пирамида
естественный
второй способ
5
усеченная пирамида (4х уг.)
искусственный
первый способ
6
трехугольная призма
естественный
первый способ
7
шестиугольная призма
искусственный
второй способ
8
октаэдр
естественный
второй способ
9
додекаэдр
искусственный
первый способ
10
икосаэдр
естественный
первый способ
 
3.  Необходимые  теоретические  сведения
 
Реалистичность изображений объектов существенно повышается, если удалить невидимые с места наблюдателя ребра и грани многогранников и построить их собственные и падающие тени. Рассмотрим подробнее вопросы построения собственных и падающих теней для разных источников освещения [4, 8, 9].
 
3.1.  Построение  собственных  и  падающих  теней  трехмерного  объекта
при  освещении  его  искусственным  источником  света
 
Пусть заданы: единичный куб, расположенный на предметной плоскости Y=0 в начале координат, а также точечный источник света Ссвет, расположенный в пространстве в точке с координатами xc, yc, zc и его проекция на предметную плоскость ссвет (рисунок 1). Необходимо построить собственные и падающие тени куба и вывести результат на картинную плоскость Z=0 с помощью аксонометрической проекции. Алгоритм решения первой части этой задачи, представляется следующим образом:
1. Строим исходные объекты в трехмерной системе координат.
2. Проводим луч от источника света Ссвет  через одну (любую) верхнюю вершину вертикального ребра куба до пересечения с его проекцией на предметной плоскости, а проекция луча представляется линией, соединяющей проекцию источника света ссвет с основанием этого же ребра куба и продолжающуюся до пересечения с лучом.
3. Точка пересечения светового луча и его проекции представляет собой проекцию вершины выбранного ребра на предметную плоскость. Соединив ее с основанием ребра, получим падающую тень конкретного ребра на предметную плоскость.
4. Повторив пункты 2 и 3 для всех оставшихся вертикальных ребер, получим их падающие тени на предметной плоскости.
5. Соединив между собой проекции вершин вертикальных ребер на предметную плоскость, получим контур падающей тени куба.
5. Собственные тени вертикальных ребер совпадают с самими ребрами и находятся на них с неосвещенной стороны.
6. Грани куба, невидимые с позиции источника света находятся в собственной тени. Ниже приведен результат реализации этого алгоритма.
Если смотреть на куб с положительного направления главной координатной оси Z, то ими будут правая, нижняя, передняя и задняя грани куба.
Рассмотрим более детально рисунок 1. Единичный куб расположен на предметной плоскости XOZ. Его падающая тень также находится на этой плоскости. Она представляется полигоном AbchgF. Часть ее, от вершины A по направлению к проекциям вершин a,c, закрыта кубом и не видна с положительного конца оси Z. Многогранник падающей тени ограничивается примыкающими друг к другу отрезками прямых, представляющими собой падающие тени вертикальных и горизонтальных ребер: AB→Ab, BC→bc, CH→ch, HG→hg, FG→gf.

Рисунок 1 - Построение падающих теней единичного куба, расположенного в начале координат и освещаемого искусственным источником Ссвет. Грани куба, невидимые с позиции источника освещения Ссвет, находятся в собственной тени - это первая, четвертая, пятая и шестая грани.
 
Следующий этап решения этой задачи заключается в том, что полученный результат необходимо "перенести" на картинную плоскость, сохраняя объемное изображение куба с учетом его теней. Предлагается выполнить аксонометрическую проекцию полученной сцены на плоскость Z=0, которая будет теперь выступать в качестве картинной плоскости.
Для этого необходимо знать координаты вершин всех преобразуемых объектов - куба, источника освещения и многоугольника падающей тени. Последние представляют собой координаты точек пересечения световых лучей с предметной плоскостью XOZ.
Расчет координат вершин полигона падающей тени. Расчет выполняется по следующему алгоритму.
1. Находим уравнение предметной плоскости. В данном простом случае это Y=0.
2. Находим компоненты единичных направляющих векторов для каждого светового луча. Например, для светового луча, проходящего через вершину B, единичный направляющий вектор найдется из соотношения:

Компоненты вектора  b - его проекции на главные оси координат X, Y, Z найдутся из формул:

3. Находим уравнения каждого светового луча, проходящего через верхние вершины куба  B, C, H, G. Например, уравнение светового луча, проходящего от источника освещения Ссвет через вершину B, в параметрической форме запишется:
4. Координаты любой точки, лежащей на этом луче, находят из (5) по соотношениям
 
x = xB + bxt;                            y = yB+ byt;                                  z = zB+ bzt                             (6)
 
5. Подставляя эти координаты в уравнение плоскости Y=0, находим значение параметра t, при которой данный луч пересекает плоскость Y=0.
6. Зная t, находим по формулам (6) координаты точки пересечения луча СсветB с плоскостью Y=0. Она и будет вершиной полигона тени  b.
7. Координаты остальных вершин полигона тени находятся по этому же алгоритму, только меняются световые лучи.
 
Проецирование сцены на картинную плоскость. Проецирование можно выполнить с помощью различных проекций. Мы выберем аксонометрическую, поскольку полигон падающей тени уже представлен в виде перспективной проекции. В качестве картинной плоскости теперь будет плоскость Z=0. "Собираем" координаты исходных объектов - куба, источника света и его проекции, полигона падающей тени в одну матрицу и выполняем проектирование. При необходимости, в матрице - результате делаем нормировку и выводим полученное изображение сцены на картинную плоскость
После проецирования, многогранники собственных и падающих теней закрашивают цветом, используя существующие методы закраски, что существенно повышает реалистичность изображенного объекта.
 
 
3.2. Построение собственных и падающих теней трехмерного объекта при освещении его естественным источником света. Первый способ.
 
Пусть заданы: единичный куб, расположенный в начале координат на предметной плоскости S, вершины которой обозначены как  s1, s2, s3, s4. Предметная плоскость лежит на плоскости Y=0.
Рисунок 2 - Начальные условия для построения собственных и падающих теней единичного куба, расположенного в начале координат на предметной плоскости S, лежащей на плоскости Y=0 и освещаемого лучами естественного источника Ссвет, идущими параллельно диагонали куба GD.
 
Куб освещается параллельными лучами естественного источника, расположенного в бесконечности. Лучи идут по направлению диагонали GD. Необходимо построить собственные и падающие тени куба и вывести результат на картинную плоскость Z=0 с помощью аксонометрической проекции.
 
Собственные тени. Для нахождения собственных теней используется рассмотренный в предыдущей лабораторной работе алгоритм Робертса. Считается, что невидимые грани многогранников находятся в собственной тени, поскольку объект сам закрывает их от наблюдателя. Напомним порядок действий при определении невидимых ребер и граней трехмерных объектов с использованием алгоритма Робертса (см. лаб. раб. №11).
1. Находим уравнения плоскостей, ограничивающих преобразуемое тело.
2. Из коэффициентов найденных плоскостей составляем матрицу тела [VT].
3. Находим корректную матрицу исходного тела [VKT].
4. Находим результирующую объемную матрицу видового преобразования Tрез.объемн.. При выводе результирующей матрицы видового преобразования пока не используем матрицу ортографической проекции Торт
5. Находим обратную матрицу от результирующей объемной матрицы видового преобразования рез.объемн.]-1.
6. Находим корректную матрицу преобразованного тела [VKT].
7. Находим нелицевые грани преобразованного тела, используя точку [E], расположенную в минус бесконечности по линии направления световых лучей. Отрицательные числа в матрице-строке результата укажут номера нелицевых граней, которые и находятся в собственной тени. Запоминаем их номера и переходим следующему этапу работы алгоритма.
 
Падающие тени. До начала работы алгоритма определения падающей тени необходимо составить уравнение исходной предметной плоскости S. Напомним, что уравнение произвольной пространственной плоскости имеет вид:

Ax + By + Cz + D = 0                                                                    (8)
 
В соотношении (15)  A,  B,  C - проекции нормали, восстановленной к плоскости, на главные оси координат  X, Y, Z,  а  D - расстояние от начала координат до плоскости. Составить уравнение плоскости - означает найти коэффициенты  A,  B,  C,  D. Существует несколько способов решения этой задачи. Рассмотрим один из них. Восстановим нормаль к плоскости  S в вершине s3. Считая прямые s3s2 и s3s4, ограничивающие плоскость, векторами, образуем их векторное произведение

Из векторного анализа известно, что векторное произведение двух векторов представляет собой третий вектор, перпендикулярный первым двум. Поскольку перемножаемые векторы в данном случае лежат на предметной плоскости  S, то результирующий вектор и есть нормаль к этой плоскости. Величины, заключенные в квадратные скобки перед направляющими единичными векторами  i, j, k главных осей координат являются искомыми коэффициентами A,  B,  C плоскости  S. Коэффициент D вычисляется подстановкой координат произвольной точки, лежащей на этой плоскости, например, точки s1 с координатами (xS1, yS1, zS1)  в соотношение (10):

D = -(Ax1 + By1 + Cz1)                                                        (10)

Затем необходимо определить пространственное положение светового луча - координаты точки пересечения его с предметной плоскостью, угол наклона к предметной плоскости и к осям координат. Падающая тень определяется ортографической проекцией вдоль линии освещения. В нашем случае световой луч идет вдоль диагонали куба GD. Известно, что базовые матрицы ортографических проекций "работают" только вдоль главных осей координат. Поэтому сначала нужно совместить световой луч с одной из осей координат, в нашей задаче это ось  Z, потом составить уравнение преобразованной предметной плоскости S. В ходе работы алгоритма определения падающих теней подвергаются преобразованиям все объекты сцены - световой луч и куб, хотя в пошаговой реализации алгоритма, для ясности изложения, называется только световой луч [1, 4, 6].
 
Прямой ход работы алгоритма.
1. Перенос светового луча так, чтобы он проходил через начало координат. Вместе с лучом переносятся все объекты сцены - куб и предметная плоскость  S.
2. Поворот луча вокруг оси  Y  на угол θ  до совмещения с плоскостью  X=0.
3. Поворот луча вокруг оси  X  на угол φ  до совмещения с осью  Z.
4. Составляем уравнение преобразованной плоскости  S  по соотношениям (9), (10), в которых вместо исходных координат точек  s2, s3, s4  берутся их преобразованные координаты.
5. Подставив  x, y  координаты вершин преобразованного куба в уравнение преобразованной плоскости, получим проекции этих вершин на предметной плоскости, которые являются вершинами полигона падающей тени. Собираем их в матрицу координат вершин падающей тени.
 
Обратный ход работы алгоритма. В обратном ходе также участвуют все объекты - световой луч, куб, предметная плоскость и полигон падающей тени. Все вершины этих объектов собраны в одну матрицу.
6. Обратный поворот луча вокруг оси  X  на угол  –φ в плоскости  X=0.
7. Обратный поворот луча вокруг оси  Y на угол –θ.
8. Перенос луча в исходное состояние до совпадения с положением исходной диагонали куба  GD. По окончанию работы алгоритма имеем трехмерное изображение исходного куба, предметной плоскости и полигона падающей тени на ней. Следующий этап - перенос трехмерного изображения сцены на картинную плоскость  Z=0.
 
Проецирование сцены на картинную плоскость. Проецирование можно выполнить с помощью различных проекций. Мы выберем аксонометрическую. В качестве картинной плоскости теперь будет плоскость  Z=0. "Собираем" координаты исходных объектов - куба, предметной плоскости и полигона падающей тени в одну матрицу и выполняем проектирование. При необходимости, в матрице - результате делаем нормировку и выводим полученное изображение сцены на картинную плоскость.
Для улучшения реалистичности полученной картины необходимо закрасить нелицевые грани куба и полигон падающей тени.


Для расширения полученных знаний и навыков улучшения реалистичности изображения трехмерных объектов, рассмотрим еще один вариант построения теней для задачи освещения естественным источником света единичного куба, расположенного в начале координат. При тех же самых начальных условиях задачи предлагается последовательный алгоритм ее решения - сначала находят собственные тени, потом падающие.
 
3.3.  Построение  собственных  и  падающих  теней  трехмерного  объекта  при  освещении  его  естественным  источником  света.  Второй  способ.
 
Пусть заданы: единичный куб, расположенный в начале координат на плоскости  Y=0. Куб освещается параллельными лучами естественного источника, расположенного в бесконечности. Лучи идут по направлению диагонали GD. Необходимо построить собственные и падающие тени куба и вывести результат на картинную плоскость  Z=0 с помощью аксонометрической проекции.

Рисунок 3 - Построение собственных и падающих теней единичного куба, освещаемого лучами естественного источника  Ссвет,  идущими параллельно диагонали куба  GD.
 
Собственные тени. Для нахождения собственных теней используется рассмотренный в предыдущей лабораторной работе алгоритм Робертса. Считается, что невидимые грани многогранников находятся в собственной тени, поскольку объект сам закрывает их от наблюдателя. Напомним порядок действий при определении невидимых ребер и граней трехмерных объектов с использованием алгоритма Робертса (см. лаб. раб. №11).
1. Находим уравнения плоскостей, ограничивающих преобразуемое тело.
2. Из коэффициентов найденных плоскостей составляем матрицу тела [VT].
3. Находим корректную матрицу исходного тела [VKT].
4. Находим результирующую объемную матрицу видового преобразования Tрез.объемн.. При выводе результирующей матрицы видового преобразования пока не используем матрицу ортографической проекции  Tорт .
5. Находим обратную матрицу от результирующей объемной матрицы видового преобразования рез.объемн.]-1.
6. Находим корректную матрицу преобразованного тела [VKTP].
7. Находим нелицевые грани преобразованного тела, используя точку [E], расположенную в минус бесконечности по линии направления световых лучей. Отрицательные числа в матрице-строке результата укажут номера нелицевых граней, которые и находятся в собственной тени. Запоминаем их номера и переходим следующему этапу работы алгоритма.
 
Падающие тени.  Алгоритм нахождения падающей тени, представляется следующим образом:
1. Строим исходные объекты в трехмерной системе координат.
2. Проводим луч от источника света  Ссвет через одну (любую) верхнюю вершину вертикального ребра куба, параллельно диагонали GD, до пересечения его с предметной плоскостью Y=0.
3. Точка пересечения светового луча и предметной плоскости представляет собой проекцию верхней вершины выбранного ребра на эту плоскость. Соединив ее с основанием ребра, получим падающую тень конкретного ребра на предметную плоскость.
4. Повторив пункты 2 и 3 для всех оставшихся вертикальных ребер, получим их падающие тени на предметной плоскости.
5. Соединив между собой проекции вершин вертикальных ребер на предметную плоскость, получим контур падающей тени куба.
 
Расчет координат вершин полигона падающей тени. Расчет выполняется по следующему алгоритму.
1. Составляется уравнение предметной плоскости. В нашем случае это Y=0.
2. Поскольку в данном случае все световые лучи параллельны друг другу, то их направление можно охарактеризовать одним общим для всех направляющим вектором, расположенным в любом месте пространства, занятого световыми лучами. Например, для светового луча, проходящего через вершины G, D, единичный направляющий вектор  g  найдется из соотношения:
Компоненты вектора  g  - его проекции на главные оси координат  X, Y, Z  найдутся из формул
3. Находим уравнения каждого светового луча, проходящего через верхние вершины куба  B, C, H, G. Например, уравнение светового луча, проходящего от источника освещения  Ссвет через вершину  B, в параметрической форме запишется:
4. Координаты любой точки, лежащей на этом луче, находят из (16) по соотношениям:
 
x = xB+ gxt;                            y = yB + gyt;                              z = zB + gzt                          (17)
 
5. Подставляя эти координаты в уравнение плоскости  Y=0, находим значение параметра  t,  при которой данный луч пересекает плоскость  Y=0.
6. Зная  t, находим по формулам (17) координаты точки пересечения луча  СсветB  с плоскостью Y=0. Она и будет вершиной полигона тени  b.
7. Координаты остальных вершин полигона тени находятся по этому же алгоритму, только меняются световые лучи.
 
Подведем некоторые итоги работы алгоритмов этого варианта определения теней. Рисунок 3 показывает, что если смотреть на куб с положительного направления главной координатной оси  Z, то в собственной тени будут его правая, нижняя и задняя грани. Единичный куб расположен на предметной плоскости  XOZ. Его падающая тень также находится на этой плоскости.  Она  представляется  полигоном AbchED. Часть ее, от вершины  A  по направлению к проекции вершины  b  закрыта кубом и не видна с положительного конца оси  Z. Многогранник падающей тени ограничивается примыкающими друг к другу отрезками прямых, представляющими собой падающие тени вертикальных и горизонтальных ребер: AB–>Ab, BC–>bc, CH–>ch, EH–>Eh, ED, AD.
Следующий этап решения этой задачи заключается в том, чтобы полученный результат "перенести" на картинную плоскость, сохраняя объемное изображение куба с учетом его теней. Предлагается выполнить аксонометрическую проекцию полученной сцены на плоскость  Z=0, которая будет теперь выступать в качестве картинной плоскости.
Для этого необходимо знать координаты вершин всех преобразуемых объектов - куба и вершин полигона падающей тени. Последние представляют собой координаты точек пересечения световых лучей с предметной плоскостью  XOZ.
Проецирование сцены на картинную плоскость. Проецирование можно выполнить с помощью различных проекций. Мы выберем аксонометрическую. В качестве картинной плоскости теперь будет плоскость Z=0. "Собираем" координаты исходных объектов - куба, полигона падающей тени в одну матрицу и выполняем проектирование. При необходимости, в матрице - результате делаем нормировку и выводим полученное изображение сцены на картинную плоскость:

Рассмотренные варианты построения собственных и падающих теней трехмерных объектов, освещаемых искусственными или естественными источниками света, можно считать частными из-за простоты начальных условий. В более громоздких задачах, в которых имеется произвольное число исходных объектов и источников освещения, алгоритмы построения собственных и падающих теней предметов сцены существенно усложняются. Тогда применяют методы теневых объемов или теневых карт.
 
 
 
 
4. Контрольные вопросы
 
1. Как образуются собственные тени трехмерных объектов?
2. Что такое падающая тень?
3. Как ее найти, в случае освещения объекта искусственным источником света?
4. Как найти падающую тень, в случае освещения объекта естественным источником света?
5. Приведите алгоритм поиска корректной матрицы преобразованного тела?
6. Какие тени можно найти с использованием алгоритма Робертса?
7. Как строятся тени в случае произвольного пространственного направления световых лучей?