// вывод оси glColor3f(1,0,0); glBegin(GL_LINES); glVertex3f(0,-20, 0) ; glVertex3f(0, 60, 0) ; glEnd() ;

if(p) // вращаем вокруг собственной оси У {

glTranslatef(50, 0,0); glRotatef(а,0, 1, 0) ;

}

else // вращаем по окружности

{

glRotatef(а, 0, 1, 0) ; glTranslatef(50, 0,0);

}

а+=2; // увеличиваем угол вращения // добавляем скос if(usem) glMultMatrixf(m);

// вывод четырехугольника glColor3f(0,0,1); glBegin(GL_QUADS); glVertex3f(-5, -5, 0) ; glVertex3f(5,-5,0) ; glVertex3f(5,5,0); glVertex3f(-5, 5, 0) ; glEnd();

Камера и позиционирование объектов

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

Вектор движения камеры

Рис. 3. Вектор движения камеры

Пусть камера находится в точке (0,0,0), а векторы ее движения и взгляда (ОД-1). Затем повернем камеру на угол а влево. Как видно из рисунка, для движения камеры вперед на один шаг нужно к ее текущим координатам добавить -l*sin(a) и l*cos(a). Те же рассуждения проводятся при последующем повороте камеры по вертикали.

Факт, что нет визуальной разницы между перемещением камеры по сцене и перемещением всех объектов сцены в обратном направлении относительно камеры, избавляет нас от необходимости изменять объем видимости. А также позволяет совместить в одном классе и камеру, и связанную с ней модель. В зависимости от специфики задачи камеру можно реализовать различными способами. Один из примеров камеры приведен в классе GLobj. При создании собственной камеры обратите внимание на возможности функции gluLookAt.

/‘

Демонстрация движения двух камер по сцене.

Для активации управления камерой нажмите ESC.

*/

GLobj cam[2]; // две камеры

int lookactive=0; // активная камера для обзора

int inputactive=0; // активная камера для ввода

void example_init()

{

gl.set(5);

glEnable(GL_DEPTH_TEST); glClearColor(0.9,0.9,0.9,1); glPolygonMode(GL_BACK,GL_LINE);

// позиционирование камер cam[1].position(20,15,-40); cam[0].position(-20,0,0);

// компилируем тестовую сцену в список Models m; m.scene 1 (1) ;

}

void example_deinit()

{

glDeleteLists(1,1); gl.deinit ();

}

// обработка ввода void input ()

{

cam[inputactive] .input(&in); switch(in.vkey)

{

case VK_F1:

lookactive=(lookactive+1)%2; break; case VK_F2:

inputactive=(inputactive+1)%2; break; default:;

^.n. vkey=0; Г

void draw() // вывод сцены -"put();

/' / очищение буфера кадра

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) giLoadldentity();

// преобразование в координаты камеры

cam[lookactive] .trans form();

cam[0].draw();

cam[1].draw();

glCallList(1);

}

Буфер кадра

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


⇐ вернуться назад | | далее ⇒