for(i=0;i<3;I++) for(j=0;j=3;j++)
myarray[4*j+i]= m[i][j];

Иногда в программе нужно выполнить некоторое преобразование, а затем восстановить предыдущее состояние. В частности, это необходимо делать при организации преобразований экземпляров. Такие преобразования не должны распространяться на все объекты, а только на выбранные. Сохранение-восстановление матриц текущего состояния выполняется с помощью стека матриц. Для записи матрицы в стек служит функция glPushMatrix( ), а для извлечения из стека - функция glPopMatrix( ). Поэтому в графических программах вы можете часто встретить примерно такой фрагмент:

glPushMatrix(); glTranslatef(....);
glRotatef (.....) ;
glScalef(.....);

/* Здесь вычерчиваются объекты */ glPopMatrix();

4.10. Взаимодействие пользователя с трехмерными графическими приложениями В рассмотренном выше примере для управления направлением вращения куба на экране использовалась трехкнопочная мышь. Но возможности такого интерфейса пользователя с приложением слишком ограничены. Вместо того чтобы три кнопки мыши использовать для задания ориентации, их можно было бы применить для управления программой, например ее завершением.

Как уже отмечалось в разделе 4.8, существует множество способов выполнения поворота вокруг произвольной оси. Мы использовали последовательное вращение вокруг осей коорди-

Объекты и геометрические преобразования

нат х, у и z, но можно организовать этот процесс и по-другому: сначала повернуть вокруг оси х, затем вокруг оси у, а закончить опять поворотом вокруг оси х. В таком случае можно добиться любой ориентации объекта, используя только две кнопки мыши. Однако по-прежнему остается проблема с направлением вращения - в нашей программе поворот всегда выполняется только в одном направлении. Для пользователя же желательно иметь возможность поворачивать в обе стороны - и вперед, и назад - и останавливать процесс, когда объект будет сориентирован, как задумано.

Библиотека GLUT позволяет использовать для управления процессом кнопки мыши в сочетании с управляющими клавишами клавиатуры. Например, левой кнопкой мыши можно задать вращение вокруг оси х по часовой стрелке, а нажав одновременно еще и клавишу <Ctrl> - против часовой стрелки.


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