Лекция библиотека Opengl 7




НазваниеЛекция библиотека Opengl 7
страница4/29
Дата публикации27.06.2013
Размер1.48 Mb.
ТипЛекция
lit-yaz.ru > Информатика > Лекция
1   2   3   4   5   6   7   8   9   ...   29
^

4. Имена функций OpenGL


Рисование сферы в программе 1.1 выполняется при помощи двух функций:

glColor3d( 1, 0, 0 );

auxSolidSphere( 1 );

Функция glColor3d() устанавливает текущий цвет, а auxSolidSphere() рисует сферу единичного радиуса с центром в начале координат.

Цвет в режиме RGBA (режим был задан в функции main()) задается четырьмя числами в диапазоне от 0 до 1: красная компонента, синяя, зеленая и прозрачность. В программе 1.1 прозрачность не нужна, поэтому вызывается вариант функции glColor() с тремя параметрами. Значение четвертого параметра, прозрачности, по умолчанию равно единице (1 – абсолютно непрозрачный материал, 0 – абсолютно прозрачный).

OpenGL была разработана для языка Си, а не Си++, поэтому вместо перегруженных полиморфных функций в этой библиотеке реализованы наборы функций с похожими именами, в которых условно обозначено количество параметров функции. Имена полиморфных функций OpenGL выбраны согласно следующему правилу:

Имя функции[n=число параметров][тип параметров]

Тип параметров обозначается одной из английских букв:

'b' – байт со знаком (char или GLbyte)

's' – короткое целое (short или GLshort)

'i' – целое (int или GLint)

'f' – вещественное (float или GLfloat)

'd' – вещественное с двойной точностью (double или GLdouble)

'ub' – беззнаковый байт (unsigned char или GLubyte)

'us' – беззнаковое короткое целое (unsigned short или GLushort)

'ui' – беззнаковое целое (unsigned int или GLuint)

'v' – массив из n параметров указанного типа

Имя glColor3d() означает, что у функции есть три параметра типа double. Например, есть еще функция glColor3i() с тремя параметрами типа int. Для целочисленных типов значение цветовой компоненты приводится к диапазону [0, 1] путем деления переданного значения на максимальное значение данного типа. Ниже приведены три поясняющих примера:
double array[] = {0.5, 0.75, 0.3, 0.7};

glColor3dv(array); // Цвет задается массивом типа double

glColor3ub(200, 100, 0); // Преобразование 200/256,100/256,0/256

glColor3d(0.25, 0.25, 0); // темно-желтый

glColor3ub(0, 100, 0); // темно-зеленый

glColor3ub(0, 0, 255); // ярко-синий

^

5. Системы координат


В OpenGL используются три системы координат: левосторонняя, правосторонняя и оконная. Первые две системы являются трехмерными и отличаются друг от друга направлением оси z: в правосторонней она направлена на наблюдателя, а в левосторонней – от наблюдателя внутрь экрана. В большинстве случаев используется правосторонняя (мировая) система координат. Левосторонняя система применяется только для задания параметров проекционного преобразования. Отображение проекции трехмерной сцены производится в двумерной оконной системе координат, связанной с окном на экране.

Смысл преобразований трехмерных координат, необходимых для получения на экране двумерного изображения трехмерной сцены, можно пояснить с помощью аналогии между OpenGL и фотоаппаратом (рис. 1.2). В обоих случаях для получения изображения выполняются следующие шаги:

  1. установка штатива и наведение фотоаппарата (видовое преобразование);

  2. размещение фотографируемых объектов (модельное преобразование);

  3. выбор объектива и/или настройка увеличения (проекционное преобр.);

  4. выбор размера печатаемой фотографии (оконное преобразование).



Рис. 1.2. Аналогия между фотоаппаратом и OpenGL.


Рис. 1.3. Порядок выполнения преобразований координат вершины объекта.
В программах на OpenGL видовые преобразования следует задавать ранее модельных. Проекционное и оконное преобразования можно описывать в любом месте программы до рисования объектов. В целом, порядок задания параметров преобразований может отличаться от строго определенного порядка выполнения математических операций над трехмерными координатами для получения двумерных экранных координат (рис. 1.3).

^

5.1 Матрицы преобразований


В OpenGL различные преобразования объектов сцены описываются с помощью матриц размера 4x4. Есть три типа матриц: видовая, проекционная и текстурная. Видовая матрица описывает преобразования объекта в мировых координатах: параллельный перенос, масштабирование и поворот. Проекционная матрица задает вид проекции трехмерных объектов на плоскость экрана (в оконные координаты), а текстурная матрица управляет наложением текстуры на объект.

Перед вызовом функций, изменяющих матрицу определенного типа, сначала необходимо установить эту матрицу в качестве текущей с помощью функции:

void glMatrixMode(GLenum mode)

Параметр mode принимает значения GL_MODELVIEW, GL_PROJECTION или GL_TEXTURE.

Значения элементов текущей матрицы можно задать в явном виде функцией:

void glLoadMatrix[f d](GLtype* m)

где m указывает на 16-ти элементный массив типа float или double. В нем сначала хранится первый столбец матрицы, затем второй, третий и четвертый.

Функция

void glLoadIdentity(void)

заменяет текущую матрицу на единичную. Содержимое текущей матрицы часто бывает нужно сохранить для дальнейшего использования. Для этого применяются функции сохранения/восстановления матрицы из служебного стека OpenGL:

void glPushMatrix(void)

void glPopMatrix(void)

Для матриц каждого типа в OpenGL есть отдельный стек. Для видовых матриц его глубина равна, как минимум, 32, для двух других типов матриц – минимум 2.

Для умножения текущей матрицы на другую матрицу справа используется функция:

void glMultMatrix[f d](GLtype* m)

где m является указателем на матрицу размером 4x4. Однако чаще для изменения матриц в OpenGL удобно пользоваться специальными функциями, которые по значениям параметров преобразований создают нужную матрицу и перемножают ее с текущей. Чтобы сделать текущей созданную матрицу, надо перед вызовом этих функций вызывать glLoadIdentity().

Теперь кратко рассмотрим преобразования, применяемые для отображения трехмерных объектов сцены в окно приложения (рис. 1.3).

^

5.2 Видовые и модельные преобразования


Видовые и модельные преобразования задаются одной и той же матрицей – видовой, т.к. изменение местоположения и направления камеры эквивалентно некоторому преобразованию координат объектов сцены (и наоборот).

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

(xnew, ynew, znew, 1)T = M  (xold, yold, zold, 1)T

Матрицу M можно создать с помощью следующих функций:

void glTranslate[f d](GLtype dx, GLtype dy, GLtype dz)

void glRotate[f d](GLtype angle, GLtype x0, GLtype y0, GLtype z0)

void glScale[f d](GLtype x, GLtype y, GLtype z)

После создания матрицы преобразования это преобразование будет применяться ко всем далее рисуемым примитивам. В случае, если надо, например, повернуть один объект сцены, а другой оставить неподвижным, сначала удобно сохранить текущую видовую матрицу в стеке функцией glPushMatrix(), затем вызвать glRotate..() с нужными параметрами, описать примитивы, из которых состоит поворачиваемый объект, а затем восстановить текущую матрицу функцией glPopMatrix().

Кроме изменения местоположения самого объекта, иногда бывает нужно изменить положение точки наблюдения. Для этого есть функция:

void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,

GLdouble centerx, GLdouble centery, GLdouble centerz,

GLdouble upx, GLdouble upy, GLdouble upz)

Координаты (eyex, eyey, eyez) определяют точку наблюдения в мировых координатах, (centerx, centery, centerz) является центральной точкой сцены, которая будет проектироваться в центр области вывода, а вектор (upx, upy, upz) задает положительное направление оси у (т.е. определяет наклон камеры). Например, если камеру не надо поворачивать, то задается значение (0, 1, 0), а со значением (0, -1, 0) сцена будет выглядеть перевернутой.

Фактически, функция gluLookAt() совершает перенос и поворот всех объектов сцены, но в таком виде задавать параметры бывает удобнее.

^

5.3 Проекционное преобразование


В OpenGL поддерживаются ортографическая (параллельная) и перспективная проекция. При ортографической проекции видимый объем пространства имеет форму параллелепипеда, при перспективной – усеченной пирамиды.

Ортографическая проекция задается одной из функций:

void glOrtho( GLdouble left, GLdouble right, GLdouble bottom,

GLdouble top, GLdouble near, GLdouble far )

void gluOrtho2D( GLdouble left, GLdouble right,

GLdouble bottom, GLdouble top)

Параллелепипед видимого объема ограничен плоскостями отсечения, которые параллельны осям левосторонней системы координат и задаются расстояниями left, bottom и т.д. Функция gluOrtho2D() по умолчанию устанавливает расстояния до ближней и дальней плоскостей отсечения: near=-1 и far=1.

Для задания перспективной проекции служит функция:

void gluPerspective( GLdouble fovy, GLdouble aspect,

GLdouble near, GLdouble far )

Эта функция задает видимый объем в форме усеченной пирамиды в левосторонней системе координат (рис. 1.4). Угол поля зрения (по оси у) fovy лежит в диапазоне от 0 до 180 градусов. Угол видимости по оси x задается параметром aspect (обычно он вычисляется как отношение сторон экранного окна вывода). Параметры far и near задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительными. Чем больше отношение far/near, тем хуже в буфере глубины будут различаться расположенные рядом поверхности, так как по умолчанию в него записываются значения глубины, нормированные в диапазоне от 0 до 1.


Рис. 1.4. Видимый объем, устанавливаемый с помощью функции gluPerspective().
Для задания перспективной проекции есть еще одна функция, с несколько другим набором параметров (рис 5):

void glFrustum( GLdouble left, GLdouble right, GLdouble bottom,

GLdouble top, GLdouble near, GLdouble far)


Рис. 1.5. Видимый объем, устанавливаемый с помощью функции glFrustum().

^

5.4 Оконное преобразование


После применения проекционной матрицы на вход следующего преобразования (перспективного деления, рис. 1.2) поступают так называемые усеченные (clipped) координаты вершин, расположенных внутри видимого объема. Значения всех компонент усеченных координат (xc, yc, zc, wc) находятся в диапазоне [-1,1]. Трехмерные нормированные координаты вершин вычисляются по формуле:

(xn, yn, zn) = (xc/wc, yc/wc, zc/wc)

Полученные нормированные координаты подвергаются оконному преобразованию. Согласно аналогии с фотоаппаратом (рис. 1.2), оконное преобразование соответствует этапу, на котором выбираются размеры получаемого двумерного изображения. Размер изображения на экране – область вывода – является прямоугольником, заданным в оконной системе координат (рис. 1.6) с помощью функции:

void glViewPort( GLint x, GLint y, GLint width, GLint height )

Значения всех параметров задаются в пикселах и определяют ширину и высоту области вывода с координатами левого нижнего угла (x, y). Размеры оконной системы координат зависят от текущих размеров окна приложения, а точка-начало координат (0, 0) располагается в левом нижнем углу окна.


Рис. 1.6. Вершины, лежащие внутри видимого объема, проектируются на его переднюю стенку (ту, которая ближе к наблюдателю) и затем отображаются в области вывода на экране.
Вычислим оконные координаты центра области вывода (cx, cy):

cx=x+width/2, cy=y+height/2.

Введем обозначения px=width, py=height. Оконные координаты каждой вершины вычисляются по формулам:

(xwin, ywin, zwin) = ( (px/2) xn + cx , (py/2) yn + cy , [(f-n)/2] zn+(n+f)/2 )

Целые положительные величины n и f ограничивают минимальную и максимальную глубину точек, которые могут попасть в область вывода (по умолчанию n=0 и f=1). Глубина каждой точки zwin записывается в специальный буфер глубины (z-буфер), с помощью которого OpenGL удаляет невидимые линии и поверхности. Установить собственные значения n и f можно вызовом функции

void glDepthRange( GLclampd n, GLclampd f )

Если у нескольких вершин совпадают двумерные координаты (xwin, ywin), то в область вывода попадет вершина с минимальным значением глубины zwin.

В консольных приложениях функция glViewPort() обычно вызывается из функции, зарегистрированной с помощью функции макета glutReshapeFunc() в качестве функции-обработчика события изменения окна приложения.

1   2   3   4   5   6   7   8   9   ...   29

Похожие:

Лекция библиотека Opengl 7 iconЛекция Биржевые опционы Лекция Границы премии (цены) опционов на акции
Лекция 10. Греки: коэффициенты чувствительности премии Лекция 11. Опционные стратегии

Лекция библиотека Opengl 7 iconЛекция Историография как научная дисциплина Лекция Исторические знания в Древней Руси
Лекция 10. Историческая наука в России в последней трети XIX – начале XX вв.: общие тенденции развития, методологические поиски

Лекция библиотека Opengl 7 iconЛекция Драго Байт «Переводы русской литературы в Словении»
Всероссийская государственная библиотека иностранной литературы им. М. И. Рудомино

Лекция библиотека Opengl 7 iconОтчет должен состоять из следующих разделов в следующем порядке
Выбрать интерфейс программирования графики из OpenGL, DirectX, Flash, gdi+ или других (согласовать с руководителем)

Лекция библиотека Opengl 7 iconЛекция для студентов III курса специальностей 060400 «Финансы и кредит»
Вашему вниманию предлагается обзорная (установочная) лекция по курсу " Информационные системы в экономике"

Лекция библиотека Opengl 7 iconУрок лекция по литературе в 10 классе «Здесь духа мощного господство…»
Оборудование: на доске портрет А. А. Фета с указанием дат его жизни, лекция учителя сопровождается презентацией

Лекция библиотека Opengl 7 iconЛекция для преподавателей курса «Основы религиозных культур и светской этики»
В основу текста положена лекция в Томском областном институте повышения квалификации работников образования

Лекция библиотека Opengl 7 iconLib. Ru: Библиотека Максима Мошкова
Крупнейшая бесплатная электронная библиотека российского Интернета. Здесь вы можете найти литературу по истории, политике, философии,...

Лекция библиотека Opengl 7 iconЛекция в Дорнахе 22 мая 1920 года
Канта и протестантизма. Эта лекция вызвала негодование среди членов Лиги, культивировавших и признававших под названием монизма вообще...

Лекция библиотека Opengl 7 iconЭлектронная библиотека Российской государственной библиотеки (ргб)
Крупнейшая бесплатная электронная библиотека российского Интернета. Здесь вы можете найти литературу по истории, политике, философии,...



Образовательный материал



При копировании материала укажите ссылку © 2013
контакты
lit-yaz.ru
главная страница