С<-1, С <- СТ(4.0, 5.0, 6.0), C<-CR(45.0, 1.0, 2.0,3.0), С<-СТ(-4.0, -5.0,-6.0).

На каждом шаге домножаем ТМП справа на новую матрицу преобразования, в результате чего вся процедура будет иметь результат

С = Т(4.0, 5.0, 6.0) R(45.0, 1.0, 2.0, 3.0) Т(-4.0, -5.0, -6.0), который полностью соответствует формуле, приведенной в разделе 4.8.1. Каждая вершина р, которая задается после того, как будет сформирована такая матрица вида, умножается справа на матрицу С, в результате чего формируется новая вершина

q = Cp.

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

4.9.5. Вращение куба В описанной ниже программе мы воспользуемся кубом, определенным в разделе 4.4, и будем врашать его по командам, формируемым при нажатии кнопок мыши. Нам потребуются три функции с обратным вызовом, которые регистрируются следующим образом:

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

glutDisplayFunc(display); glutldleFunc(spincube); glutMouseFunc(mouse);

В функции отображения display ( ) сначала устанавливается матрица вида, для чего используются три угла, заданных в функции обработки событий мыши mouse(). Затем с помощью функции colorcube(), которую мы рассматривали в разделе 4.4, вычерчивается куб. В этом примере будет использоваться двойная буферизация. При каждом вызове display() очищаются буфер кадра и буфер глубины. Последний используется для удаления невидимых поверхностей. Выполнение display ( ) завершается процедурой переключения буферов:


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