Обработанное изображение проецируется на ближнюю плоскость, а затем выводится в окно. OpenGI позволяет определить область вывода окна. Если эта область не соответствует по размерам ближней плоскости, то изображение проекции масштабируется. По умолчанию область вывода равна клиентской области окна.
Рис. 2. Ортогональная и перспективная проекции Вращение, масштабирование, сдвиг являются базовыми преобразованиями координат. На конечный результат последовательных преобразований влияет порядок их применения. Предположим мы применили преобразования 1,М и N. в результате чего получили матрицу преобразования ИМ, которая изменяет координаты вершины v следующим образом: LMNv. В OpenGL это равносильно последовательному применению этих преобразований в обратном порядке, т. е. L(M(Nv)). Таким образом, следующий код вращает объект, расположенный в точке (50,0,0) вокруг собственной оси Y на угол а.
glLoadldenty(); glTranslatef(50,0,0); glRotatef(а,0,1,0); а+=2; А поменяв местами вызовы двух функций, получим движение объекта по окружности, лежащей в плоскости XZ и с радиусом 50.
glLoadldenty(); glRotatef(а,0,1,0); glTranslatef(50,0,0); в +=2; Цвет также можно рассматривать как вершину в трехмерном пространстве цветов. В последних версиях OpenGL и в таких расширениях как, SGI_color_matrix и ARBJmaging, реализован дополнительный стек матриц для преобразований цвета. Сделав его активным вызовом glMatrixMode(GL_COLOR), матрицу можно изменять обычными функциями OpenGL как glTranslate. Таким образом, можно применять эффекты как увеличение яркости не только к растровым изображениям, но и к геометрическим моделям.
А также в последних версиях OpenGL и в расширении ARB_transpose_matrix можно загружать и умножать транспонированные матрицы.
Список функций для работы с матрицами преобразований: gILoadldentity - загружает единичную матрицу; gILoadMatrix - загружает матрицу из памяти; gIMatrixMode - выбирает активный стек матриц; gIMultMatrix - умножает текущую матрицу на указанную; gIPushMatrix - сохраняет текущую матрицу в стеке; gIPopMatrix - восстанавливает текущую матрицу из стека; gIFrustum - объем видимости с перспективной проекцией; glOrtho - объем видимости с ортографической проекцией; gluOrtho2D - объем видимости с ортографической проекцией; gluPerspective - объем видимости с перспективной проекцией; glViewport - изменение области вывода в окно; gIRotate - вращение; gIScale - масштабирование; glTranslate - сдвиг.
/*
Демонстрация функций преобразования координат. */
float а=0; // текущий угол вращения int р=0; // способ вращения int usem=l; // использовать ли матрицу // матрица дополнительного преобразования float m[16];
void example_init()
{
gl.set(1);
glClearColor(1,1,1, 1) ;
// загружаем в матрицу преобразование скоса m[0]=l;m[5]=l;m[10]=l;m[15]=l; m[4]=0.5774; // ctg(60);
}
void example_deinit()
{
gl.deinit();
}
// обработка ввода void input()
{
switch(in.vkey)
{
case VK_F1: p=!p; break; case VK_F2: usem=!usem; break; default:;
}
in.vkey=-l;
}
void draw() // вывод сцены {
input();
glClear(GL_COLOR_BUFFER_BIT) ; glLoadldentity() ;