Последний этап - сдвинуть все обратно с помощью матрицы сдвига Т(х/, у,, Суперпозиция двух сдвигов и проективного преобразования проецирует вершину (л, у, х) в точку (Хр. у р. гД где
Рис. 5.42. Проекция многоугольника тени: а - при взгляде от источника света; б - источник сдвинут в начало координат
5.9. Проецирование и формирование теней Для формирования такого многоугольника в программе OpenGL можно изменить матрицу вида:
GLfloat m[16]; /* Матрица проективного преобразования тени */ for(i=0;i<15;i++) m[i]=0.0; m[0]=m[5]=m[10]=1.0; m[7]= -l.Û/yl;
glColor3fv(polygon_color)
glBegin(GL_P0LYG0N} /* Вычертить многоугольник как обычно. */
glEnd( )
glMatrixMode(GL_MODELVIEW); glPushMatrix() /* сохранить состояние */ glTranslatef(xl,yl,zl); /* сдвинуть */ glMultMatrixf(m); /* проекция */
glTranslate(-xl,-yl,-zl); /* перенести источник света в начало координат */
glColor3fv(shadow_color);
glBegin(GL_POLYGON);
/* Снова вычертить многоугольник. */
glEnd();
glPopMatrix(); /* восстановить состояние */
Обратите внимание на то, что, хотя выполняется проективное преобразование относительно точки положения источника света, матрица, которую мы при этом используем, является "системной" матрицей вида. Тот же самый многоугольник вычерчивается дважды: первый раз - как обычно, а второй раз - с использованием измененной матрицы вида, которая преобразует вершины многоугольника. И для исходного многоугольника, и для его тени используются одни и те же параметры визуализации. Результат вычисления многоугольника тени для изображения цветового куба показан на ил. 5 цветной вклейки, а программу формирования тени вы найдете в файле cubes.с.
В простых программах, например в программе, отображающей тень, которую отбрасывает на землю летящий самолет, описанный прием работает достаточно эффективно. Его можно использовать и при работе не с точечным, а с удаленным (параллельным) источником света (см. упр. 5.17). Но если объект отбрасывает тень на поверхность другого объекта, то такая методика не годится. В главе 9 будет описан другой, более общий метод формирования теней, который, правда, требует гораздо более сложных вычислений.