Динамическая графика 1994 г.

Анимаци в векторной графике - Изображение затененных поверхностей.


3.8 Изображение затененных поверхностей.

Итак, мы составили простой и быстро работающий алгоритм для решения вопроса видима грань или невидима. Но с этой зада чей непосредственно связана еще одна задача. Очень интересно выглядят трехмерные тела, если у них есть грани, которые видимы, но находятся в тени. То есть, если в пространстве имеется источник света (а он в общем случае может перемещаться так же, как и Ваши объекты), то встает задача определения, а какие же грани находятся в тени? Если такие грани заштриховать, програм ма получит очень сильный толчок вперед

Если алгоритм для определения видима грань или нет, Вам понятен, то задачу эту решить можно. Представьте себе, что глаз наблюдателя расположен там, где в данный момент находится источник света. Тогда те грани, которые видимы для такого "глаза" и будут освещены, а те, которые нет, экажутся в тени и должны штриховаться.

Вернемся к нашей трехмерной проекции и предположим что источник света находится справа от нас (рис.50).

А

X Y

Рис. 50 Расположение источника света

Теперь, если мы будем смотреть на наш объект так, как буд то бы наш глаз находится там же, i де расположен источник света, то увидим следующую картину (рис. 51).

Y -X

Рис. 51 Взгляд на объект

со стороны источника света

Z

Картина очень похожа на ту. что была и раньше, только как бы ось 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 программистам удалось достичь таких скоростей, что кое-что оии затушевали. В то же время, в имитаторах колесных и гусеничных машин теневые стороны холмов и сооружений затушевываются (заливаются) очень часто.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
PartyZone! - Первое и последнее демопарти под маркой Конструкции Хаоса, проводимая в третьем тысячелетии, будет проходить в Санкт-Петербурге, Россия в августе 2001 года.
Система - Описание музыкального редактора FLASH TRACKERa v2 (for SOUND DRIVER v1.0).
Реклама - раздел бесплатных обьявлений.
Have a Fun! - Шахматная лихорадка.
Экспертиза - прохождение игры Mercenary.

В этот день...   1 января

SibNews #08, Woot! #01, Spectrum Magazine #01, ACNews #25, Psychoz #14, ACNews #14, Last 128 #08, Last 128 #06, Last 128 #05, Last 128 #04, Last 128 #03, Last 128 #02, Last 128 #09, Last 128 #3.5, Last 128 #8.025, Sinclair Club #05, Last 128 #M!R 01, Fantadrom #01, Buzz #20, Last 128 #01, DonNews #13, Nicron #120, Promised Land #01, Inferno #01, Marazm #25, Ultimathum #01, Marazm #21, Hooy Mag #02, KrNews #11, Marazm #22, Marazm #23, ZX Football 2000 #01, Codemania #01, Always #03, Bugs #02, IzhNews #08, Virtual Worlds #01, Listok #04, Scenergy #02, Flash Info #18, Marazm #16, Marazm #17, Zed #01, Balagan #02, ZX Format #08, ZX Power #03, Shock #01, Impulse #02, Deja Vu #03, ZX Club #08, ZX Club #06, Numberology #01, Marazm #13, Marazm #12, Marazm #14, Gorodok #02, Zodiac #01, Marazm #15, Deja Vu #07, Marazm #11, Deja Vu #07, Playboy #03, Crazy News #2, Crazy News #4, ZX Light #01, Crazy News #5, Playboy #02, ZX News #03, ZX Review #1-2, Read Me #02, Crazy News #3, Nicron #13, Read Me #01, Public Spirit #01, Faultless #06, Faultless #05, ZX Software #01, Stump #04, Speccy #07, Возраждение #0, Speccy #03, On-Line #17, Scene+ #01, Welcome Press #01, ZX Konig #04, Adventurer #01, Faultless #05, Faultless #04, Di Halt #01, Faultless #01, Playboy #01, Crazy News #1, Faultless #03, Pioneer #03, Sinclair Town #02, ZX Magazine #01, Eldorado #01, ZX Magazine #02, Spectron #01, ZX News #01, ZX Konig #02, 200 #W, Welcome Press #00, Dune #07, Subliminal Extacy #01, Subliminal Extacy #02, ZX Konig #01, Subliminal Extacy #00, Muchomor #01, Spectrofon #01, ZX Revija #02, Outlet #01, Outlet #1-3