8.4. Обход деревьев узел, который алгоритм уже "посетил", а потому вновь возвращаемся к узлу Корпус. Далее исследуется следующее по порядку ребро, исходящее из этого узла, которое ведет к поддереву Правое плечо. Процедура обхода этого поддерева аналогична уже рассмотренной процедуре обхода поддерева Левое ппечо. Поддеревья Левое бедро и Правое бедро обходятся точно таким же образом. При завершении обхода каждого поддерева алгоритм возвращается к корневому узлу и восстанавливает исходное значение M матрицы вида.

Возможно, проще было бы рассматривать весь этот процесс с помощью текущей матрицы преобразования - матрицы вида С, которая применяется по отношению к примитивам, определенным в узле (ее структура и роль в графической системе описаны в главе 4). Исходное значение С равно M и преобразуется в ММЛ при обработке узла Голова, потом в ММ/(Ю, затем в ММ/„„М//<, и т.д. Обновление значения С должно выполняться прикладной программой перед вызовом каждой функции отображения примитива, заданной в очередном узле дерева в порядке его обхода. Для реализации этого алгоритма обхода в графической системе OpenGL, кроме функций формирования матриц поворота, сдвига и масштабирования, нам потребуются еще и функции glPushMatrix( ) - для сохранения текущей матрицы преобразования в стеке и glPopMatrix( ) -для извлечения значения матрицы из стека.

Рассмотрим программный код начального фрагмента функции figure(), в котором опущены значения аргументов функций преобразования:

figure() {
glPushMatrix(); torso(); glTranslate glRotate3 head();
glPopMatrix();
glPushMatrix();
glTranslate
glRotate3
left_upper_arm();
glTranslate
glRotate3
left_lower_arm()
glPopMatrix();
glPushMatrix()
glTranslate
glRotate3
right_upper_arm(); glPopMatrix(); glPushMatrix()

При первом вызове glPushMatrix( ) в стеке сохраняется текущее значение матрицы вида (предполагается, что перед этим уже была вызвана функция glMatrixMode(GL_MODELVIEW)). Сохранив это значение на будущее, можно сразу же приступать к модификации матрицы вида- далее вызываются функции glTranslate( ) и glRotate( ), которые формируют матрицу М/, I/ одновременно домножают текущую матрицу вида на сформированные матрицы преобразования. После этого вызывается функция отображения головы фигурки head( ). Поскольку узел Голова является терминальным, нам нужно вернуться к его родительскому узлу. В программе это реализуется восстановлением предыдущего значения текущей матрицы преобра-


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