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

Следующий шаг - построение тени от куба на заданной плоскости. Для того, чтобы получить на заданной плоскости тень от грани, необходимо спроектировать эту грань на плоскость относительно источника света (в нашем случае это будет параллельным проектированием, параллельным вектору lightDir). Проекцию произвольной вершины р грани будем искать в виде

p+t*lightDir

Для определения проекции необходимо найти то значение t, при котором точка p+t*lightDir попадет на плоскость. Считая, что плоскость задана уравнением

(p,n)+d=0,

получаем для t следующее уравнение:

(p,n)+d+t(lightDir,n)=0

Это линейное уравнение относительно t, разрешив его, находим проекцию точки р на заданную плоскость. Чтобы построиь тень от грани необходимо спроектировать все вершины грани на плоскость и по полученным вершинам нарисовать на экране (это потребует еще одной проекции, при помощи камеры) грань теневого цвета. Таким образом проектируются и рисуются все грани, составляющие куб, непосредственно перед выводом самого куба. Соответствующий фрагмент кода для плоскости у=-2 приводится ниже.

void Cube :: drawShadow () { Vector3D border [4]; Point contour [4]; // draw plane, assuming it's y = -2 setcolor ( 5 ); setfillstyle ( SOLID_FILL, 5 ); bar ( 0, getmaxy () / 2, getmaxx (), getmaxy () ); // now draw shadows on the plane Point p [8]; for ( int i = 0; i < 8; i++ ) { float t = (2 - vertices [i].y) / lightDir.y; Vector3D v = vertices [i] + t * lightDir; camera.project ( v, p [i] ); } for ( i = 0; i < 6; i++ ) { for ( int j = 0; j < 4; j++ ) contour [j] = p [facets [i].v [j]]; setcolor ( 2 ); setfillstyle ( SOLID_FILL, 2 ); fillpoly ( 4, (int far *) contour ); } } Все исходные тексты можно взять здесь.

<<Шаг 4 - Расчет освещенности Шаг 6 - Анимация>>

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

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