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 () и задает положение


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