Замечание
Напомню если режим GL_COLOR_MATERIAL не включен, то текущие цветовые установки не влияют на цвет поверхности тора, поэтому он выглядит серым хотя текущий цвет задан зеленоватым.
Переменная spin задает угол поворота системы координат, связанной с источником света по оси X Положение источника света в этой системе координат определено в массиве position
const
position : Array [0..3] of GLfloat = (0, 0, 0, 0, 1 5, 1.0);
Перерисовка кадра выглядит так:
glPushMatrix; // запомнили мировую систему координат
glRotated (spin, 1.0, 0.0, 0.0); // поворот системы координат
glLightfv (GL_LIGHTO, GL_POSITION, Sposition), // задаем новую позицию
// источника света glTranslated (0.0, 0.0, 1.5); // перемещаемся в точку, где
// располагается источник света
glDisable (GL_LIGHTING); // отключаем источник света
glutWireCube (0.1); // визуализируем источник света
glEnable (GL_LIGHTING); // включаем источник света
glPopMatrix; // возвращаемся в мировую систему координат
glutSolidTorus (0.275, 0.85, 8, 15), // рисуем тор
Требуются некоторые пояснения Кубик рисуется с отключенным источником света для того, чтобы он не получился таким же, как тор, серым. Большинство параметров источника света задается с помощью команды glLightfv Первый параметр команды - идентификатор источника, второй аргумент - символическая константа, указывающая, какой атрибут устанавливается, последним аргументом задается ссылка на структуру, содержащую задаваемые значения
Как видно из кода, для задания позиции символическая константа должна быть GL_POSITION, указываемый массив определяет позицию источника света в текущей системе координат Источник света, подобно невидимому объекту, располагается в заданной точке и не перемещается вслед за системой координат. После того как его позиция зафиксирована, трансформации системы координат не приведут к изменению положения источника.
В этом примере значения элементов массива не изменяются, а система координат перемещается с течением времени Можно и наоборот - изменять значения элементов массива, а систему координат не трогать. Это сделано в следующем примере, проекте из подкаталога Ех02, где положение источника света задается значениями элемента массива LightPos, изменяющимися с течением времени:
With frmGL do begin
LightPos[0] := LightPos[0] + Delta;
If LightPos[0] > 15.0
then Delta := -1.0
else If (LightPos[0] < -15 0) then
Delta := 1.0,
InvalidateRect(Handle, nil, False);
end,
Перерисовка кадра начинается с того, что задается текущее положение источника света:
glLightfv(GL__LIGHTO, OPPOSITION, @LightPos}; glCallList(Sphere);
В примере источник света колеблется над поверхностью сферы. Теперь настала пора разобрать параметры источника света, связанные с оптическими характеристиками окружающей среды Эти характеристики складываются из трех отражений: фоновое, диффузное и зеркальное Символьные константы GL_AMBIENT, GL_DIFFUSE и GL_SPECULAR, указанные в качестве второго аргумента команды glLight, позволяют задавать требуемые свойства окружающей среды.
Наиболее важными для нас пока являются первые две характеристики Я приведу их упрощенное толкование, которого вам будет вполне достаточно для успешного использования соответствующих команд. Конечно, эти понятия имеют физическое обоснование, и неплохо было бы разобраться в нем, но пока можно ограничиться и поверхностным представлением Вес цвета в диффузной составляющей задает, насколько сильно этот цвет отражается поверхностью при ее освещении. И наоборот, вес цвета в фоновой составляющей задает, насколько сильно этот цвет поглощается поверхностью.
По умолчанию поверхность ничего не поглощает и все отражает. Следующий пример, проект из подкаталога Ех03, является развитием предыдущего, в нем добавлена возможность задания значений для характеристик источника цвета.
Окно приложения снабжено всплывающим меню. По выбору пункта меню появляется диалог задания цвета; выбранный пользователем цвет устанавливается значением нужной характеристики источника света. Здесь я воспользовался разобранной во второй главе процедурой, которая переводит системный цвет в диапазон, обычный для OpenGL:
procedure TfrmGL.AmbientlClick(Sender: TObject);
begin
If ColorDialogl.Execute then ColorToGL (ColorDialogl.Color, Ambient [0], Ambient [I], Ambient 12);
end;
С помощью этого проекта можно подбирать свойства источника света для дальнейшего использования в других проектах. При выборе пункта Info появляется окно, в котором выводятся текущие характеристики источника света (Рисунок 4.1).