Graphics & Media Lab. >> Курсы >> Курс Шикина 2000г.
ПРИМЕР - ШАГ 4

Следующий шаг - правильное закрашивание граней куба в зависимости от их ориентации относительно источника света.

Будем считать, что источник света расположен в бесконечноудаленной точке пространства и лучи света образуют параллельный пучок с направляющим вектором lightDir. Тогда для расчета интенсивности света, покидающего грань (в предположении, что грань диффузная, то есть свет равномерно покидает грань во всех направлениях), можно воспользоваться следующей формулой

( lightDir,n ) ,

где n - вектор единичной внешней нормали к грани.

void Cube :: drawShaded () { Point p [8]; Point contour [4]; Vector3D v; int color; // project vertices for ( int i = 0; i < 8; i++ ) camera.project ( vertices [i], p [i] ); computeNormals (); for ( i = 0; i < 6; i++ ) if ( isFrontFacing ( i, camera ) ) { int color = 8 - 7*( facets [i].n & lightDir ); for ( int j = 0; j < 4; j++ ) contour [j] = p [facets [i].v [j]]; setcolor ( color ); setfillstyle ( SOLID_FILL, color ); fillpoly ( 4, (int far *) contour ); } }

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

palettetype pal; initgraph ( &drv, &mode, "" ); getpalette ( &pal ); for ( int i = 0; i < pal.size; i++ ) setrgbpalette (pal.colors [i],(63*i)/15,(63*i)/15,(63*i)/15); Все исходные тексты можно взять здесь.

<<Шаг 3 - Закраска граней Шаг 5 - Расчет тени>>

Graphics & Media Lab. >> Библиотека | Курсы | Графикон

Hosted by Graphics & Media Lab.
http://graphics.cs.msu.su
lab_logo
mailto:Laboratory
Last modified: 24-Aug-2001