Buzz #17
10 апреля 1999

GOURAUD - Ликбез в области 3D-shading (алгоритм заливки грани методом GOURAUD).

(C) 1999 SaiR00S/EI

    Целью  данной  статьи (а, возможно, и цикла статей, если Вам
все   это   покажется   небезинтересным)   является   проведение
небольшого  ликбеза  в  области  3D-shading,  ибо  меня  , мягко
скажем, достали  изречения в  отношении данного вопроса в стиле:
"Паа-фа-а, аа-а хде моге ?" и т.п.
    Ну ладно, хватит о грустном, перейдем непосредственно к теме
сегодняшнего повествования.
    Gouraud     shading     -     это     метод    заливки    3D
поверхности,основанный  на  Ламбертовской  модели  освещения , и
являющийся  ее усовершенствованием (подробнее , кому интересно ,
читайте  об  этом  в  литературе  на  данную тему или проясняйте
данный  вопрос на очной встрече со мной за пару пива :) . Ну дак
вот  ,  при  данной  модели  освещенности,  интенсивность света,
падающего на плоскость определяется из угла между вектором света
и  вектором  нормали  к  поверхности.  Чуть-чуть поднапрягшись в
математике  ,  мы  вспоминаем  ,  что  косинус  угла между двумя
векторами определяется следующим образом:

cos (AB) = (Xa*Xb+Ya*Yb+Za*Zb)/(|A|*|B|)

 где Xa,Xb,Ya,Yb,Za,Zb - соответственно координаты концов векто-
                         ров A и B;
     |A|,|B| - соответственно длины этих векторов,   вычисляемых
               довольно просто :), как гоеметрическая суммa  ко-
               ординат Xa..Za:

               |A| = sqrt (Xa^2+Ya^2+Za^2),
               аналогично  находим |B|.

    Применительно  к  Gouraud , это нам дает информацию о том, в
какой цвет закрашивать полигон.
    Итак  ,  что-же  нам  нужно  для  образования поверхности по
методу Gouraud:
    -   во-первых   -  это  координаты  вершин  спроецированного
полигона  (мы  будем  использовать  треугольник,т.к. он является
наиболее простым, быстрым и он наиболее математически корректен,
ибо  три  его  вершины не могут лежать в разных плоскостях, чего
нельзя сказать о других видах полигонов);
    -  во-вторых  - это значения интенсивности света в каждой из
вершин.

    О   том   ,   как   спроецировать  вершину  на  плоскость  я
рассказывать  не  буду  ,  а  вот  на том, как получить значение
интенсивности  света  в  вершинах,  я  остановлюсь  поподробнее.
Итак,к  каждой  грани  3D  об'екта  мы  имеем  нормаль. В каждой
вершине   об'екта  мы  восставляем  нормаль,  являющуюся  суммой
нормалей  граней , окружающих данную вершину. Затем, нормализуем
полученные   нормали,   и,   взяв   какую-либо   координату   за
интенсивность   света   относительно   оси,   образуемой  данной
координатой  и  началом  координат  ,  получаем значение цвета в
данной точке.
    Следующая картинка поможет чуть-чуть осознать прочитанное.

                  (X1,Y1),a1
                    /
                  /   \    a1..a3 - зна-
                /        чения  цветов в
              /        \ точках с  коор-
            /            динатами X1-X3,
(X2,Y2),a2/             \         Y1-Y3.
          \
            \            \
              \
                \         \
                  \
                    \      \
                      \
                        \   \
                          \
                            \\
                           (X3,Y3),a3

    Далее  ,  линейно проинтерполировав цвета от a1 до a2, от a2
до  a3,  и  от  a1  до  a3, мы получим значения цветов на каждую
вертикальную линию . Кому не лень, интерполяцию можете проводить
по уравнению прямой:

                          Y = A*X + B,

в  результате  чего  получите  небольшой тормоз. Гораздо удобнее
интерполировать по Брезенхему ( этим вы избавитесь от деления).
    После  этого  интерполируете  цвета на каждой горизонтальной
линии и одновременно прорисовываете полигон:

           LD A,H    ;Заносим в A значе-
                     ;ние цвета
           ADD HL,DE ;Интерполируем цвет
                     ;по горизонтальной
                     ;линии
           LD (BC),A ;Выбрасываем цвет в
                     ;буфер
           INC C     ;Переходим к следу-
                     ;ющей точке.

    И все! Получаете красивый (насколько это может быть красивым
на Spectrum ) Gouraud shading.
    Прежде,  чем бросаться все это кодить , можно посмотреть как
это  выглядит  у VAV'а в Refresh ( та часть, где бублик мотается
на  фоне  глаза)  ,  или  на  AMIGA (хотя чистый Gouraud там уже
большая  редкость, все Phong, да Phong ...) в последних демах от
Ramses,  но  уже  с  Texture Mapping'ом (настоятельно рекомендую
просмотреть  все  лучшие  демы  за  97-98 годы , так, для общего
развития...).
    За сим прощаюсь, успехов на demoscene !





Другие статьи номера:

AGA - Графический редактор 3 color'ных скринов AGA v1.0.

ASCII графика - Как просматривать ASCII? Как научиться ASCII. Существуют ли вспомогательные программы для ASCII.

BLOB the COP - Текст из внутренностей игры фирмы Players для хаккеров.

C.Expirience - Cheat к игре Space Crusade.

DOS PRO - Самые быстрые процедуры работы с диском: чтение/запись секторов без контроля и с контролем ошибок, чтение секторов с контролем на исправность чтения, чтение/запись секторов с контролем в прерываниях, зажигание/гашение лампочки дисковода, раскручивание и торможение диска, сброс ВГ13, позиционирование на 0 трек, защита от Magic Button, гашение лампочки дисковода, проверка какой текущий, контроль наличия диска в дисководе.

Eternal News - новости от Ковровских спектрумистов (Ash, Proxima, EI)

GOURAUD - Ликбез в области 3D-shading (алгоритм заливки грани методом GOURAUD).

Hard Life - О создании новой DOS для Speccy.

HDD Autodetect - FDD & HDD loader.

Heroes of M&M II - Презентация игры: Heroes of might & magic II.

MMA в Коврове - Великий и ужасный в городе, где никогда не делали ковры.

Modern Word - Описание текстового редактора Modern Word v1.3

Parties?! - FunTop'99 vs Chaos Construction'99: Точка зрения.

Program BOX - Новый необычный boot - Program BOX v2.0.

Rants & Raves - Как проехать на электричке по поддельным билетам.

Switch 3.5' - Как юзать 3.5 привод после его подключения.

Всяко разно - Выписки из книги рекордов Гиннеса.

Всяко разно - Ультросовременная сказочка про почти конец света.

Жизьтянка - Жизненные проблемы SPY.

Контакты - координаты для связи.

Кризис - Рассказик в стиле игрового мира из ним.

Обзор игрушек - Обзор игровых программ: Figus, Зеркало, Iron Man, Gyron Atrium, Homer Simpson in Russia, Головобол, Monster Land, Devil's course, Astro Ball, Net Walk, Nexus.

Обзор системок - Обзор системных программ: Text Maker v0.12c, Excess Sample Editor v1.4, Best View v2.6, DOS2DOS COPYv2.0, Excess Deluxe Paint v1.0 demo, Laser Compact v5.0, Consul Commander v3.33, DCM Protection KIT v4.1b, Modern Word v1.3, E-Mage Work Statio, PKZIP.

От авторов - Об изменениях в оболочке газеты.

Про Крузю - Новелла к игре "Бегство на Хархан".

Реклама - Реклама и объявления...

Точка зрения - О написании Softа для Спектрума.

Авторы газеты


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

Похожие статьи:
Кое-что еще - TIME KEEPER пишет все новые и новые версии эксгуматоров файлов, доделывает журнал, дописывает марио.
Программистам - Чанки на бордюре.
Реклама - Продается игровая приставка "SEGA".

В этот день...   16 октября