glClear(GL_DEPTH_BUFFER_BIT);
5.6. Путешествие с камерой по сцене В программе, рассмотренной в главе 4, куб вращался относительно начала координат. Использовалось ортогональное проецирование, и нам не нужно было думать о том, как размещается камера, - положение и ориентация, устанавливаемые системой по умолчанию, нас вполне устраивали.
В новой версии программы будет использовано перспективное проецирование, и мы позволим наблюдателю "ходить" с камерой по сцене, управляя его движением с помощью клавиш <х>, <Х>, <у>, <Y>, <z> и <Z>. Для задания положения и ориентации камеры воспользуемся функцией gluLookAt( ).
Для того чтобы разработанная раньше программа соответствовала новой спецификации, в нее придется внести минимум изменений. Определим массив viewer[3], в котором будем хранить информацию о положении камеры. Содержимое этого массива будет изменяться программой обработки событий клавиатуры keys( ):
void keys(unsigned char key, int x, int у) {
if(key == | 'x' ) | viewer | -= | 0; | ||
if(key == | 'X' ) | viewer | += | 0; | ||
if(key == |
'У') |
viewer | -= | 0; | ||
if(key == | 'Y' ) | viewer | += | 0; | ||
if(key == | 'Z' ) | viewer | -= | 0; | ||
if(key == | 'Z' ) | viewer | += | 0; | ||
display() |
}
В функции отображения display() вызывается функция LookAt(), которая использует массив viewer для задания параметров камеры, а в качестве точки визирования используется начало координат. Тот фрагмент программы, который организует вращение куба, остается в новой версии без
Визуализация
изменений. Управление вращением по-прежнему реализуется с помощью мыши. Обратите внимание на очередность вызовов функций, изменяющих матрицу вида в функции display ():
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
gluLookAt(viewer[0],viewer[l],viewer[2], 0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[l], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0);
colorcube();
glFlush(); glutSwapBuffers();
}
Функция glFrustum() вызывается из функции перерисовки myReshape () и задает положение