Иерархические графические модели

зования из стека- вызовом функции glPopMatrix( ). Затем программа переходит к обходу следующего поддерева, и первая операция - вновь сохранить текущее значение матрицы вида в стеке, т.е. вызвать функцию glPushMatrix( ). Обход последующих поддеревьев выполняется в программе аналогично.

На ftp-сервере по адресу ftp.cs.unm.edu в каталоге pub/angel/BOOK читатели найдут текст программы figure.с, в которой добавлено обращение к специальному меню, позволяющему пользователю управлять углами поворота в сочленениях. В этой программе примитивы, описывающие отдельные элементы фигурки, сформированы из эллипсов и цилиндров, а вся модель закрашивается с помощью методов, рассмотренных в главе 6.

При подготовке текста рассмотренной программы совершенно не учитывалась обработка атрибутов (цвета и свойств материалов), которые можно ассоциировать с каждым узлом иерархической модели. Атрибуты являются в OpenGL параметрами режима, т.е. они устанавливаются программой в режимных переменных и воздействуют на отображение всех последующих примитивов до тех пор, пока программа не изменит текущее значение атрибута. Поэтому при обходе дерева с атрибутами следует поступать так же, как и с текущими значениями матрицы преобразования, - сохранять в стеке и восстанавливать из стека. Предположим, например, что при выполнении функции вычерчивания корпуса torso( ) был установлен красный цвет, а при вычерчивании следующего компонента фигурки - головы - соответствующая функция устанавливает синий цвет. Если в программах отображения остальных компонентов фигурки нет операторов установки текущего цвета, то все они будут нарисованы синим цветом. Этот же цвет останется текущим и после завершения выполнения функции figure( ). При обходе дерева в другом порядке может случиться так, что большинство элементов будет вычерчено красным цветом.

Такая ситуация может привести вас в замешательство, но существуют методы, которые позволяют успешно справиться с ней. С атрибутами следует поступать так же, как и с текущей матрицей преобразования, - помещать текущее значение в стек при переходе к очередному узлу (поддереву) и восстанавливать из стека после возврата из этого узла (поддерева). В OpenGL это выполняется с помощью функций glPushAttrib( ) и glPopAttrib( ). Если при входе в функцию figure( ) поместить атрибуты в стек, а перед выходом извлечь их из стека, текущие значения атрибутов восстановятся. Более того, внутри функции figure( ) можно дополнительно сохранять и восстанавливать значения атрибутов. В OpenGL переменные состояния можно разделить на группы и записывать в стек или извлекать из стека всю группу единым обращением к соответствующим функциям. Для этого в прикладной программе нужно установить определенные разряды в маске, которая является аргументом функции glPushAttrib( ). Группы атрибутов включают и источники света, информацию о которых можно таким же способом помещать в стек и извлекать из него.


⇐ Предыдущая| |Следующая ⇒