// вывод оси 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 память, выделенная для всех пикселей выводимого изображения, называется буфером кадра. В свою очередь буфер кадра состоит из г'°скольких буферов, содержащих значения различных свойств пикселя