Список функций для работы со списками отображений: gINewList - начало списка; glEndList - конец списка; gICallList - отображение указанного списка; gICallLists - отображение нескольких списков; gIListBase - установка базового индекса для списков; gIGenLists - поиск нескольких пустых смежных списков; gIDeleteLists - уничтожение списка.
/*
Компиляция отображения мозаичного объекта в список отображения.
*/
// указатель на функцию обратного вызова
typedef void(_stdcall*tesscb)();
float rot=0; // текущий угол вращения uint mylist; // имя списка
void example_init()
i
gl.set(5);
glClearColor(l,1,1,1) ; glColor3f(0, 1,0);
// мозаичный объект GLUtesselator*obj=gluNewTess() ;
// устанавливаем функции обратного вызова gluTessCallback(obj,GLU_TESS_BEGIN, (tesscb)glBegin) ;
gluTessCallback(obj,GLU_TESS_VERTEX,
(tesscb)glVertex3dv); gluTessCallback(obj,GLU_TESS_END,(tesscb)glEnd); // внешний контур многоугольника (четырехугольник) double countur[4][3]=
{-5,0,0, 9,0,0, 12,12,0, -5,12,0);
// внутренний контур многоугольника (треугольник) double hole[3][3]=
{7.5,7.5,0, 1.2,1.7,0, 1. 7,7.5,0};
// выбираем один пустой список mylist=glGenLists(1) ;
// начинаем компиляцию в список glNewList(mylist, GL_COMPILE) ;
// собираем мозаичный объект gluTessBeginPolygon(obj,NULL); gluTessBeginContour(obj); // внешний контур gluTessVertex(obj,countur[0],countur[0] ) ; gluTessVertex(obj,countur[1],countur[1]) ; gluTessVertex(obj,countur[2],countur[2] ) ; gluTessVertex(obj,countur[3],countur[3]) ; gluTessEndContour(obj); gluTessBeginContour(obj); // дырка gluTessVertex(obj,hole[0],hole[0]); gluTessVertex(obj,hole[1] , hole[1]) ; gluTessVertex(obj,hole[2],hole[2]) ; gluTessEndContour(obj); gluTessEndPolygon(obj); // конец сборки glEndList(); // конец компиляции gluDeleteTess(obj);
}
void example_deinit()
{
// уничтожения списка glDeleteLists(mylist,1); gl.deinit();
}
void draw() // вывод сцены {
glLoadldentity();
glClear(GL_COLOR_BUFFER_BIT);
glTranslatef(0,0,-50);
glRotatef(rot,0,1,0); rot+=2;
glCallList(mylist); // вывод списка
}
Матрицы преобразования
OpenGL использует три стека матриц для хранения преобразования различных координат.
Стек проективных матриц - предназначен для хранения параметров проекции.
Стек видовых матриц - предназначен для хранения преобразований координат вершин.
Стек текстурных матриц - предназначен для хранения преобразований текстурных координат.
Функции преобразований координат изменяют содержимое матрицы на вершине активного стека, называемой текущей.
Рис. 1. Свойства камеры
Объем видимости - объем, ограничивающий бесконечное мировое пространство, т. е. определяющий видимое пространство камеры. Объекты вне этого объема не отображаются, поэтому он также называется объемом отсечения. Обычно он задается шестью плоскостями, однако OpenGI поддерживает и дополнительные отсекающие плоскости, количество которых зависит от реализации. Чтобы избежать ошибок с буфером глубины, не следует объем видимости делать слишком большим.
При установлении объема видимости OpenGL добавляет в текущую матрицу проективное преобразование. Для разработки программ, подобных CAD-системам, используется ортографическая проекция. Для построения реалистичных трехмерных сцен используется перспективная проекция. В последнем случае плохо заданный объем видимости может привести к сильным искажениям объектов. Поэтому для этой цели удобней пользоваться функцией gluPerspective.