void mouse(int btn, int state, int x, int y) {
if(btn==GLUT_LEFT_BUTTON && state == GLUT_D0WN)

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

thêta[angle] += 5.0;
if( theta[angle] > 360.0 ) theta[angle] -= 360.0;
}
if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
theta[angle] -= 5.0;
if( theta[angle] < 360.0 ) theta[angle] += 360.0;
}
glPushMatrix(); switch(angle) {
case 0 : glLoadIdentity();
glRotatef(theta[0], 0.0, 1.0, 0.0); glGetFloatv(GL_MODELVIEW_MATRIX,torso_node.m); break;

/* блоки case для других значений индекса angle */

glPopMatrix(); glutPostRedisplay();
}

Для того чтобы продемонстрировать гибкость рассмотренного метода, добавим в программу возможность динамически вставлять и удалять узлы в дерево. Такой динамический узел формируется приведенным ниже фрагментом программы:

typedef treenode* tree_ptr;
tree_ptr torso_ptr;
torso_ptr = malloc(sizeof(treenode));

Заполняется узел, как и в предыдущем варианте, следующим программным кодом: glLoadIdentity();

glTranslatef(-(TORSO_RADIUS+UPPER_ARM_RADIUS),
0.9*TORSO_HEIGHT, 0.0); glRotatef(theta[3], 1.0, 0.0, 0.0); glGetFloatv(GL_MODELVIEW_MATRIX,lua_ptr->m); lua_ptr->f = left_upper_arm; lua_ptr->sibling = rua_ptr; lua_ptr->child = lla_ptr;

Для обхода дерева, состоящего из динамических узлов, рекурсивной функции передается в качестве аргумента указатель на структуру корневого узла дерева:

traverse(torso_ptr);

Конечно, для отображения фигурки киборга использование динамических узлов вряд ли может дать какие-либо преимущества, но в более сложных программах этот подход позволяет формировать модели в интерактивном режиме, по командам пользователя. В частности, на его основе можно разработать приложение, при работе с которым пользователь сможет редактировать структуру сложного объекта, добавляя или удаляя компоненты по своему выбору. Именно на таком принципе создаются программы редактирования сцены, которые мы рассмотрим в разделе 8.8.

8.5. Обход древовидных структур 351

8.6. Анимация В обоих рассмотренных примерах используются подвижные, шарнирные (articulated) объекты, которые состоят из компонентов неизменной формы, соединенных подвижными сочленениями - шарнирами. Такие модели несложно заставить двигаться - для этого нужно динамически изменять состояние сочленений, количество которых, как правило, невелико. Иерархическая программная модель позволяет сформировать сложное движение за счет одновременного изменения состояния нескольких сочленений. Но в предыдущих разделах мы не рассматривали вопрос, как организовать в программе управление изменением состояния сочленений во времени, которое воспроизводило бы задуманное пользователем перемещение объекта и позволяло создавать "оживляемые" изображения (выполнять анимацию).


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