11
Приклад коду, що задає світове вікно і видовий екран з використанням графічної бібліотеки Open GL:
static GLint viewport[] = [0, 0, 400, 400];
/* видовий екран задається координатами вікна */ static GLclamped depth_range[] = {0.0, 1.0};
/* поправки до мінімального і максимального значень, які можуть зберігатися у буфері глибини */
static GLdouble viewing_volume[] = {-100.0, 100.0, -100.0, 100.0, - 10.0, 10.0};
/* аргументи в координатах перегляду, (1 – 4) – горизонтальний і вертикальний розміри вікна,
(5 – 6) – відстань від екрана до найближчої і найдальшої площини */
glOrtho {viewing_volume[0], viewing_volume[1], …, viewing_volume[5]};
/* визначає тип проекції, створює матрицю об’єму, що переглядається*/
glViewport (viewport[0], …, viewport[3]);
/* визначає прямокутник вікна і відображає в нього зображення
*/
glDepthRange (depth_range[0], depth_range[1]);
/* визначає кодування z-координат при перетворенні перегляду */
1.4 Графічні примітиви
Графічні примітиви (primitives) – це елементи графіки (точки, лінії, ламані, полігони), які можуть відображатись бібліотекою і задаються однією або декількома вершинами (vertices). Вивід примітивів в OpenGL оформлюється парою функцій:
glBegin (mode);
… // вершини об’єкта glEnd ();
де
mode – код типу об’єкта.
11
12
Таблиця 1.1 – Трактовка списку вершин для різних аргументів функції glBegin
mode |
Як виконується графічний вивід |
|
GL_POINTS |
Вершини-окремі точки |
|
|
|
|
GL_LINES |
Вершини, з’єднані відрізками |
|
прямої |
||
|
||
GL_LINE_STRIP |
Полілінія |
|
|
|
|
GL_LINE_LOOP |
Замкнена полілінія |
|
|
|
|
GL_TRIANGLES |
Трійки вершин, що створюють |
|
трикутники |
||
|
||
GL_TRIANGLE_STRIP |
Зв’язані трикутники (полоса) |
|
|
|
|
GL_TRIANGLE_FAN |
Зв’язані трикутники зі спільною |
|
вершиною (веер) |
||
|
||
|
|
|
GL_QUADS |
Чотири вершини, що створюють |
|
чотирикутники |
||
|
||
GL_QUAD_STRIP |
Зв’язані чотирикутники |
|
|
|
|
GL_POLYGON |
Багатокутник |
|
|
|
Наприклад, програмний код для малювання сузір’я Велика Ведмедиця:
glBegin (GL_POINTS); glVertex2i (289, 190);
/* Dubhe */ glVertex2i (320, 128);
/* Merak */ glVertex2i (230, 67);
/* Phecda */ glVertex2i (194, 101);
/* Megrez */ glVertex2i (129, 83);
12
13
/* Alioth */ glVertex2i (75, 73);
/* Mizar */ glVertex2i (74, 74);
/* Alcor */ glVertex2i (209, 10);
/* Alcaid */ glEnd ();
glVertexXX (…) – функція завдання координат, яка має декілька варіантів суфікса в залежності від типу і кількості аргументів, наприклад:
i – 32-х бітне ціле; f – 32-х бітне дійсне; d – 64-х бітне дійсне.
Якщо ми інкапсулюємо команди Open GL для малювання точки в базову функцію drawDot(), то така підпрограма буде виглядати наступним чином:
void drawDot (GLint x, GLint y);
{
glBegin (GL_POINTS); glVertex2i (x, y); glEnd ();
}
OpenGL відстежує множину змінних стану: поточний розмір точки, поточий колір малювання, колір фону.
Розмір точки встановлюється за допомогою функції glPointSize(), колір для малювання: glColor3f (red, green, blue).
Наприклад, деякі з кольорів можуть бути задані так: glColor3f (1.0, 0.0, 0.0) // червоний
glColor3f (1.0, 1.0, 1.0) // білий
Колір фону встановлюється за допомогою функції
glClearColor (red, green, blue, alpha), де змінна alpha визначає ступінь прозорості.
13
14
1.5 Дисплейний файл
Дисплейний файл (display list) – це група команд графічної бібліотеки, збережена для подальшого виконання.
Дисплейний файл забезпечує зручність та ефективність упорядкування та обробки команд бібліотеки.
Створення дисплейного файлу:
glNewList (AREA_FILL, GL_COMPILE_END_EXECUTE); glBegin (GL_POLYGON);
glVertex2i (point1); glVertex2i (point2);
…
glEnd (); glEndList ();
Дисплейний файл Open GL орієнтований на оптимізацію продуктивності для роботи в мережі, яка забезпечується завдяки тому, що дисплейний файл працює дуже швидко та зберігається у виді списку команд, а не у виді динамічної бази даних.
При передачі підпрограми Open GL по мережі, дисплейні файли зберігаються на сервері, завдяки чому скорочується мережевий трафік.
До створеного дисплейного файлу можна застосувати наступні операції:
множинне виконання;
ієрархічне виконання;
видалення.
1.6 Текст та маркери на малюнках
Більшість графічних бібліотек підтримує два види тексту: екранний або 2D,текст для пояснень, 3D - об’ємний текст.
Атрибути теста:
-шрифт;
-відношення висоти до товщіни;
-кут нахилення літер;
-положення ы напрямок рядка тексту.
Текст може буди представлений символами двох видів: апаратними (складаються з окремих відрізків), та
14
15
програмними(заздалегіть розробляються графічними програмами та зберігаються в пам’яті комп’ютера.)
Маркери різних типів (точка, коло, хрестик, сніжинка) використовуються для виділення точек на графіках. Open GL не підтримує маркери явно, але надає механізм їх збереження маркерів у растрових файлах і виведення їх на екран.
1.7 Перетворення координат
Афінні перетворення – лінійні перетворення координат, які надають гнучкий спосіб керування розмірами, орієнтацією та розміщенням обїєктів, що нас цікавлять.
Область застосування:
складання картинки з однакових об’єктів простої форми;
використання «мативу» для створення малюнка;
перегляд сцени з різних точок спостереження;
анімація шляхом перетворення форм(робота з окремими локальними системами координат обьєктів);
перетворення координат з однієї системи в іншу. Перетворення координат з однієї системи в іншу вимагають
застосування операцій трансляції, повороту і відображення.
Ці перетворення виконуються графічною бібліотекою самостійно, а програміст повинен тільки вказати:
при перетворенні модельних координат в світові – трансляцію (переміщення) і поворот;
при перетворенні з світових координат в координати спостережника – точки зору, точки спостереження та напрямок вектора вертикалі.
15