3.8 Изображение затененных поверхностей.
Итак, мы составили простой и быстро работающий
алгоритм для решения вопроса видима грань или невидима. Но с этой зада
чей непосредственно связана еще одна задача. Очень интересно выглядят
трехмерные тела, если у них есть грани, которые видимы, но находятся в
тени. То есть, если в пространстве имеется источник света (а он в общем
случае может перемещаться так же, как и Ваши объекты), то встает задача
определения, а какие же грани находятся в тени? Если такие грани
заштриховать, програм ма получит очень сильный толчок вперед
Если алгоритм для определения видима грань или
нет, Вам понятен, то задачу эту решить можно. Представьте себе, что
глаз наблюдателя расположен там, где в данный момент находится источник
света. Тогда те грани, которые видимы для такого "глаза" и будут
освещены, а те, которые нет, экажутся в тени и должны штриховаться.
Вернемся к нашей трехмерной проекции и предположим что источник света находится справа от нас (рис.50).
А
X Y
Рис. 50 Расположение источника света
Теперь, если мы будем смотреть на наш объект
так, как буд то бы наш глаз находится там же, i де расположен источник
света, то увидим следующую картину (рис. 51).
Y -X
Рис. 51 Взгляд на объект
со стороны источника света
Картина очень похожа на ту. что была и раньше,
только как бы ось Y заняла место оси X, а ось "-Х" заняла место оси Y
Это, конечно, очень частный случай, но для понимания сути вопроса нам
годится и он Теперь мы можем пересмотреть формулы (16), с помощью
которых мы по трехмерным координатам объекта x,y,z находили плоские
экранные координаты X, Y и переписать их для случая, когда глаз
находится там же. где источник света.
Тогда вместо:
X = SQR(3)*(y-x)/2 Y = z (У+х)/2
Мы получим
X = SQR(3)*(у+х)/2
Y = z - (у х)/2 (17)
Теперь, если Вы захотите написать процедуру,
которая определит, какие грани затеняются, то Вам можно будет заменить
строки 120 и 130 в вышеприведенной программе (с.164), учитывая те
изменения, которые произошли в формуле (17) и по той же самой методике
найти грани, которые являются "невидимыми" с точки зрения источника
света Если грань одновременно видима для Вас и невидима для источника света, то она штрихуется (заполняется).
Для "заполнения" грани можно воспользоваться
технологией, которую мы рассматривали в книге "Элементарная графика" на
стр.173. Единственной проблемой при этом может быть выбор точ ки,
которая находится внутри заполняемого контура, с которой начинается
процесс заполнения. Она обязательно должна оказаться внутри контура,
иначе процесс "заливки" испортит весь экран. Вручную, конечно такую
точку можно выбрать без проблем, но в динамической графике программа
сама должна правильно находить такую точку, невзирая на то, какова
сложность фигуры.
Если все грани у Вашего объекта представляют
собой выпуклые многоугольники (а так и должно бы быть, особенно если Вы
все грани упростили до треугольников с помощью декомпозиции), то это
делается очень просто (см. рис. 52) Берем любую вершину, например А
(ха,уа). Берем две соседние вершины, например В с координатами xb и yb
и С (хс,ус). Кстати, найти их несложно, поскольку у нас имеется массив,
описывающий каждую грань. Те перь мысленно соединяем В и С и на отрезке
ВС находим среднюю
точку S. Ее координаты:
xs=(xb+xc)/2; ys=(yb+yc)/2
А теперь мысленно соединяем точку А с точкой S и на полученном отрезке тоже найдем середину, точку О. Ее координаты:
xo=xa/2+xb/4+xc/4; yo=ya/2+yb/4+yc/4
Рис. 52 Поиск точки
внутри контура
Эта точка всегда
будет лежать внутри нашего треугольника ABC, и, соответственно, внутри
и выпуклого многоугольника ABCD... Если же Ваш исходный многоугольник
невыпуклый, то надо сначала исполнить декомпозицию его на треугольники.
В заключение отметим, что технология
затушевывания замкнутых контуров работает довольно медленно и поэтому в
быстрорабо-тающих программах применяется нечасто. Так, например, в
авиаимитаторах и "звездных войнах" на "Спектруме" как правило не до
этого, хотя в программе Starglider программистам удалось достичь таких
скоростей, что кое-что оии затушевали. В то же время, в имитаторах
колесных и гусеничных машин теневые стороны холмов и сооружений
затушевываются (заливаются) очень часто.