Список функций для работы со списками отображений: 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.


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