Тривимірна графіка OpenGL

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Кафедра: Інформаційні технології
Тривимірна графіка OpenGL

1. Теоретична частина
1.1 Підключення графічної бібліотеки OpenGL до інтерфейсу Windows
Стандарт реалізації OpenGL для Windows вимагає виконання деяких установок, пов'язаних з особливостями операційної системи. Для того щоб віконна система могла працювати з OpenGL, необхідно провести її ініціалізацію і сконфігурувати буфер фрейму.
Система OpenGL, як і будь-яке інше додаток Windows, потребує посиланням на вікно, на якому буде здійснюватися відтворення. Посилання на контекст відтворення - величина типу HGLRC (Handle to OpenGL Rendering Context) - пов'язує OpenGL з віконними системами Windows.
Для отримання цього контексту OpenGL потребує величиною типу HDC (контекст пристрою) вікна, на який буде здійснюватися висновок.
Таким чином, щоб почати працювати з командами OpenGL, додаток повинен створити один або декілька контекстів відтворення для потоку, і зробити поточним один з них. Кожен потік при цьому може мати один і тільки один поточний контекст відтворення, який асоційований з певним контекстом пристрою.
Перш ніж отримати контекст відтворення, сервер OpenGL повинен отримати детальні характеристики використовуваного обладнання. Ці характеристики зберігаються в спеціальній структурі, тип якої TPixelFormatDescriptor (опис формату пікселів). Формат пікселів визначає число біт на піксел, конфігурацію буфера кольору і допоміжних буферів використовуються для виведення зображення.
Для установки формату пікселів необхідно написати відповідну процедуру, типовий приклад якої наведено в додатку 2.
Для роботи з контекстом відтворення в Win32 API реалізовані наступні функції.

wglCreateContext (dc);

Функція створює контекст відтворення OpenGL, який підходить для малювання на пристрої, визначеному дескриптором dc. При успішному завершенні функція повертає дескриптор створеного контексту відтворення OpenGL, і NULL - в разі невдачі.
Поточний контекст відтворення потоку повинен бути єдиним. Наступна функція дозволяє визначити контекст відтворення для контексту пристрою.

wglMakeCurrent (dc, hrc);

При завершенні роботи, необхідно, щоб контекст ніким не використовувався. Для цього досить виконати виклик функції:

wglMakeCurrent (0,0);

Завершуючи роботу з OpenGL необхідно видалити контекст відтворення. Для цієї мети використовується функція:

wglDeleteContext (hrc);

Після того як видалений контекст відтворення, слід видалити і асоційований з ним контекст пристрою.
Структуру програми, що використовує OpenGL, можна зобразити у вигляді схеми (рис. 1)
1.2 Синтаксис команд OpenGL
Для того щоб команди OpenGL були доступні в проекті, необхідно вказати бібліотеку в списку використовуваних модулів.
Всі команди починаються з префікса gl, потім йде ім'я команди, цифра і суфікс. Цифра в закінченні відповідає кількості аргументів, літера показує необхідний тип аргументу.
Якщо ім'я команди закінчується на v (векторна форма), то аргументом її служить покажчик на масив значень.
Наприклад: Якщо останні три символи в імені команди 3 fv, то її аргумент - адреса масиву трьох дійсних чисел.
У загальному вигляді команду можна представити:
glCommandName {1,2,3,4} {b, s, i, f, d, ub, us, ui} {v} (arguments)
Таблиця 1.1. Можливі типи аргументів
Символ
Позначення типу в OpenGL
Розшифровка
b
GLbyte
Байтовий
s
GLshort
Короткий цілий
i
GLint
Цілий
d
GLdouble
Речовий подвійної точності
f
GLfloat
Речовий
ub
GLubyte
Байтовий, беззнакових
us
GLushort
Короткий цілий, беззнакових
ui
GLuint
Цілий, беззнакових
Майже завжди переважно використовувати команду у речовій формі, оскільки зберігає дані OpenGL саме в матеріальному форматі.
1.3 Малювання примітивів
Процедура малювання полягає в командні дужки
glBegin (mode)
... / / Команди, що вказують вершини фігури
glEnd;
Головне призначення командних дужок - це завдання режиму, що визначає як з'єднувати точки (вершини). Вершини задаються своїми координатами (кількість координат залежить від простору зображення) за допомогою команд glVertex {2,3,4} {s, i, f, d} (arg).
Режим (mode), що задає правило з'єднання точок, визначає примітив. До примітивам відносяться точки, лінії, пов'язані лінії, замкнуті лінії, трикутники, пов'язані трикутники, чотирикутники, пов'язані чотирикутники і багатокутники.
Приклад: завдання сторони куба
glBegin (GL_POLYGON);
glNormal3f (0.0, 0.0, 1.0);
glVertex3f (1.0, 1.0, 1.0);
glVertex3f (-1.0, 1.0, 1.0);
glVertex3f (-1.0, -1.0, 1.0);
glVertex3f (1.0, -1.0, 1.0);
glEnd;
Таблиця 1.2. Значення параметра mode
mode
Опис
GL_POINTS
Кожен виклик glVertex задає окрему точку. Малює N точок
GL_LINES
Кожна пара вершин задає відрізок. Малює N / 2 ліній
GL_LINE_STRIP
Вимальовується ламаються. Елементи n і n +1 визначають відрізок n. малюється N - 1 відрізків
GL_LINE_LOOP
Вимальовується брухту, причому її остання точка з'єднується з першою. елементи n і n +1 визначають відрізок n. остання лінія визначається елементом N і 1. малюється N відрізків
GL_TRIANGLES
Кожні три виклики glVertex задають трикутник. елементи 3n - 2, 3n-1, і 3n визначають трикутник n. Вимальовується N / 3 трикутників.
GL_TRIANGLE_STRIP
Малюються трикутники із загальною стороною. Для непарного n, елементи n, n +1, n +2 визначають трикутник n. Для непарного n елементи n +1, n, n +2 визначають трикутник n. Вимальовується N-1 трикутників.
GL_TRIANGLE_FAN
Малює групу з'єднаних трикутників. Один трикутник визначається для кожного елемента після двох попередніх. Два останніх елемента з'єднуються з першим. малюється N - 2 трикутників.
GL_QUADS
Кожні чотири виклику glVertex задають чотирикутник. малюється N / 4 чотирикутника.
GL_QUAD_STRIP
Чотирикутники із загальною стороною. поєднуючи парні елементи з парними, а непарні з непарними.
GL_POLYGON
Полігон. Елементи з 1 по N визначають цей полігон.
(При цьому точки полігону сортуються так, щоб грані у получившегося багатокутника не перетиналися)
1.4 Візуалізація сцени
Для створення сцени необхідно задати область виведення об'єктів і задати спосіб проектування.
Якщо область висновку не задана явно, то в OpenGL використовується встановлена ​​за замовчуванням зона у вигляді куба видимості 2x2x2 з початком координат у центрі куба (рис. 2).
SHAPE \ * MERGEFORMAT
Вікно видимості
X
Y
Z

Рис. 2. Вид системи координат Oxyz
Система координат в OpenGL Oxyz (рис. 2) розташована таким чином, що вісь Oz спрямована в бік, протилежний напряму зору. Вікно видимості (Windows) масштабується в межах [-1; 1] по осях Ox, Oy. Зображення по замовчуванню відтворюється на площині z = 0.
Існує два типи проектування: паралельна проекція і перспективна. Ортогональна проекція - це окремий випадок паралельної проекції, при якій проектують промені ортогональні картинної площини.
При ортогональному проектуванні точка (x, y, z) на об'єкті проектується на точку (x, y, 0) на площині проекції. У OpenGL ортогональна проекція, яка характеризується паралелепіпедом видимості, задається функцією glOrtho (), оголошеною наступним чином:
glOrtho (left, right, bottom, top, near, far)
Таким чином, видно всі об'єкти, які потрапили всередину паралелепіпеда видимості.
При проектуванні, перетворення координат включає в себе етапи, зображені на рис. 3. Спочатку світові координати (система координат, у якій визначається положення об'єкта, положення точки спостереження і екрану) перетворюються в видові координати. При цьому точки зображення залишаються на своїх місцях, але система світових координат переходить в систему видових координат. Потім виконується перспективне перетворення, що додає ефект перспективи в залежності від відстані від об'єкта до екрана і відстань від точки спостереження до екрану. Система тривимірних видових координат переходить в систему двомірних екранних координат. При побудові паралельної проекції перспективне перетворення не виконується, і видові координати використовуються в якості екранних координат (X, Y).

Світові координати (х, y, z)
Видове перетворення
Видові координати (x, y, z)
Проективне перетворення
Екранні координати (x, y)

Рис. 3. Схема перетворення координат
1.5 Видові перетворення
Видові перетворення здійснюються за допомогою матричних перетворень. У OpenGL поточна матриця перетворень є добутком двох матриць - матриці моделі і матриці проектування, при цьому формується єдина матриця перетворення, яка застосовується до всіх вершин всіх геометричних об'єктів.
Матриця моделі - glMatrixMode (GL_MODELVIEW) пов'язана з координатами об'єктів. Це матриця в базисі видових координат, вона використовується для побудови картинки в тому вигляді як її бачить спостерігач.
Матриця проектування - glMatrixMode (GL_PROJECTION). Матриця в системі координат пристрою. Обчислює нормалізовані координати, які перетворюються в екранні після трансформацій, пов'язаних з областю виводу.
Команда glLoadIdentity замінює поточну матрицю одиничної матрицею (матрицею з одиницями по головній діагоналі і рівними нулю усіма іншими елементами).

1.6 Афінний перетворення
1.6.1 Масштабування
Перетворення масштабування збільшує або зменшує розміри об'єкта.
Команда масштабування glScale (arg1, arg2, arg3) з трьома аргументами - коефіцієнтами масштабування по кожній з осей.
Якщо масштабні множники більше одиниці об'єкт розтягується в заданому напрямку, якщо менше об'єкт стискується. Масштабні множники можуть мати негативні значення, при цьому зображення перевертається з відповідної осі. При двовимірних побудовах значення коефіцієнта по осі Z ігнорується.
Після команд малювання слід відновити нормальний масштаб, щоб кожне наступне звернення до обробникові перемальовування екрану не призводило б до послідовного зменшення / збільшення зображення.
1.6.2 Поворот
Для повороту зображення використовується команда
glRotate (arg1, arg2, arg3, arg4)
з чотирма аргументами:
arg1 - кут повороту (в градусах),
arg2, arg3, arg4 - вектор повороту.
1.6.3 Зрушення
Перетворення зсуву зміщує точки в нові позиції відповідно до заданим вектором зміщення. Перенесення системи координат здійснюється командою
glTranslate (arg1, arg2, arg3)
arg1, arg2, arg3 - величини переносу по кожній з осей.
Для повороту навколо довільної фіксованої точки спочатку потрібно виконати перетворення зсуву, яка поєднувала задану фіксовану точку з початком координат, потім виконати перетворення повороту навколо початку координат, а потім зворотне перетворення зсуву. Порядок маніпуляції з системою координат: спочатку перенесення, потім поворот, після закінчення малювання - у зворотному порядку: поворот, потім перенесення.
1.7 Зафарбовування об'єктів сцени
У тривимірному просторі поверхню об'єктів характеризується матеріалом. Матеріал може відображати, поглинати і пропускати світло різної довжини хвиль. У залежності від характеристик матеріалу і від властивостей джерела світла ми бачимо об'єкти різними. Властивості матеріалу задаються за допомогою команди glMaterialfv (). Характеристики властивостей матеріалу, визначають відповідні їм символьні константи, які представлені в таблиці 1.3.
Таблиця 1.3. Характеристики властивостей матеріалу
GL_AMBIENT
розсіяне світло
GL_DIFFUSE
Параметр, який вказує наскільки сильно цей колір відбивається поверхнею при її висвітленні
GL_EMISSION
випромінюване світло
GL_SHININESS
ступінь відбитого світла
Дзеркальний колір задає колірну гаму відблисків матеріалу, ступінь дзеркального відображення визначає, наскільки близька поверхню до ідеального дзеркала (визначається числом з інтервалу [0,128]).
Властивості матеріалу задаються для зовнішньої і внутрішньої сторони фігури.
glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @ MaterialFront);
glMaterialfv (GL_BACK, GL_AMBIENT_AND_DIFFUSE, @ MaterialBack);
Існує кілька режимів малювання багатокутників.
Щоб змінити метод відображення багатокутника використовується команда:
glPolygonMode (GLenum face, Glenum mode)
Параметр mode визначає, як будуть відображатися багатокутники, а параметр face встановлює тип багатокутників, до якої застосовуватиметься ця команда і можуть приймати наступні значення:
Таблиця 1.4. Значення параметрів face і mode
GLenum face
GL_FRONT
для лицьових граней
GL_BACK
для зворотних граней
GL_FRONT_AND_BACK
для всіх граней
Glenum mode
GL_POINT
Відображаються вершини багатокутників
GL_LINE
представляється набором відрізків
GL_FILL
зафарбовуються поточним кольором з урахуванням освітлення і цей режим встановлено за умовчанням.
Приклад:
GlPolygonMode (GL_FRONT, GL_POINT);
GlPolygonMode (GL_ BACK, GL_LINE);
GlPolygonMode (GL_FRONT_AND_BACK, GL_FILL);

1.8 Джерела світла
Без джерела світла зображення не видно. За замовчуванням освітлення відключено. Що б ініціалізувати джерело, і включити обробник розрахунку впливу джерела на об'єкти досить виконати команди:
glEnable (gl_lighting);
glEnable (gl_light0);
Джерело світла за замовчуванням розташовується в просторі з координатами (0,0, ¥), можна створювати джерело світла в будь-якій точці простору зображень.
Параметри джерела світла задаються за допомогою команди,
glLightfv (source, parameter, pointer_to_array).
Перший параметр команди - ідентифікатор джерела
Другий аргумент - символічна константа, що задає атрибут
Третій - посилання на структуру, що містить задаються значення для даного атрибуту.
Таблиця 1.5. Константи, що задають властивості навколишнього середовища і позицію джерела світла
GL_Position
задає позицію джерела світла, джерело світла не переміщається за системою координат (x, y, z, cos J)
GL_AMBIENT
розсіяне світло
GL_DIFFUSE
Параметр, який вказує наскільки сильно цей колір відбивається поверхнею при її висвітленні
GL_SPECULAR
відбите світло
GL_EMISSION
випромінюване світло
GL_SHININESS
ступінь відбитого світла
GL_AMBIENT_AND_DIFFUSE
задає поглинання кольору поверхнею в розсіює складової
GL_SPOT_direction
напрям світла (x, y, z)
GL_SPOT_Cutoff
задає максимальний кут випромінювання джерела світла [0,90] і 180.

Для того щоб внутрішня сторона об'єкта була видна необхідно включити освітленість для внутрішньої сторони багатокутника. Світлова модель з освітленням внутрішньої частини багатокутника включається або вимикається відповідною функцією
glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, 1).
Другий аргумент 0 або 1 (вкл. або викл.).
1.9 Накладення текстури
Створення текстури в пам'яті
Після того як образ підготовлений, можна створювати текстуру в пам'яті. Для цього в OpenGL передбачені дві команди: одна для одновимірного й друга для двовимірного варіантів образу (обидві працюють тільки в режимі RGBA).
glTexlmage1D (void glTexlmage2D (
GLenum target, GLenum target,
GLint level, GLint level,
GLint components, GLint components,
GLsizei width, GLsizei width,
GLint border, GLsizei height,
GLenum format, GLint border,
GLenum type, GLenum format,
const GLvoid * pixels) GLenum type,
const GLvoid * pixels)
При створенні текстури можна визначити кілька образів з різним дозволом. Якщо текстура має розмір 2 n x2 m, то можна визначити max {n, m} + 1 зменшених масивів. Перший має розмір 2 n x2 m, другий - 2 n -1 x2 m -1, і т.д., поки останній не буде мати розмір 1x1. Команди glTexImage * D надають можливість визначити р = max {n, m} таких масивів, в кожному з яких зберігається зменшений образ вихідного зображення. Наявність таких масивів дозволить OpenGL використовувати менший образ для меншого об'єкта, а більший для більшого. Іншими словами, чим менше об'єкт, тим менше його деталей вдається розглянути.
Параметри текстури
Один елемент на екрані може покривати декілька елементів масиву образу, і, щоб уникнути проблем, пов'язаних зі сходовим ефектом, необхідно враховувати всі зачіпають цей масив елементи.
Для цього визначаються чотири точки в масиві образу, які відображаються в чотири кута елемента на екрані. Ці точки з'єднуються, і утворюється чотирикутник. Значення потрапляють в нього елементів зважуються з урахуванням частки кожного елемента, що міститься в багатокутнику, і потім сумуються.
Для врахування особливостей текстури необхідно налаштувати параметри текстури, що можна зробити за допомогою команди
glTexParameter [i, f, v] (target, pname, param)
target - Визначає, з якою текстурою передбачається працювати, - одномірної або двовимірної
pname - Визначає символічне ім'я параметра текстури:
ра r ат визначає значення для параметра РПА me
1.10 Використання додаткових бібліотек
Незважаючи на те, що бібліотека OpenGL надає практично всі можливості для моделювання і відтворення тривимірних сцен, деякі з функцій, які потрібні при роботі з графікою, безпосередньо відсутні в стандартній бібліотеці OpenGL. Наприклад, щоб задати положення і напрямок камери, з якої буде спостерігатися сцена, потрібно самому розраховувати модельну матрицю, а це далеко не всі вміють. Тому для OpenGL існують так звані допоміжні бібліотеки.
Бібліотека GLU
Бібліотека GLU вже стала стандартом і поставляється разом з головною бібліотекою OpenGL. До складу цієї бібліотеки увійшли більш складні функції, наприклад для того щоб визначити циліндр або диск буде потрібно всього одна команда. Також до бібліотеки увійшли функції для роботи зі сплайнами, реалізовані додаткові операції над матрицями та додаткові види проекцій.
Бібліотека GLUT
Це незалежна від платформи бібліотека. Вона реалізує не тільки додаткові функції OpenGL, але й надає функції для роботи з вікнами, клавіатурою і мишкою. Для того щоб працювати з OpenGL в конкретній операційній системі, треба провести деяку попередню настройку і ця попередня настройка залежить від конкретної операційної системи. З бібліотекою GLUT все набагато спрощується, буквально кількома командами можна визначити вікно, в якому буде працювати OpenGL, визначити переривання від клавіатури або мишки і все це не буде залежати від операційної системи.
Бібліотека надає функції, за допомогою яких можна визначати складні правильні багатогранники: куб, сфера, тор, конус, тетраедр і додекаедр, і навіть можна за допомогою однієї команди визначити складний об'єкт, наприклад, чайник. Наприклад, для відтворення куба достатньо виконати команду: glutSolidCube (N), де N-задає величину боку грані куба. Перелік можливих функцій наведено у додатку 3.

2. Практична частина
2.1 Моделювання двовимірних графічних об'єктів і анімації з використанням графічного стандарту OpenGL
Створити двовимірну сцену. Зобразити дві синусоїди в декартовій системі координат, використовуючи примітиви OpenGL. Поставити обертання в площині екрана навколо довільно обраного центру таким чином, щоб різні синусоїди мали різні швидкості обертання.
2.2 Моделювання тривимірних графічних об'єктів і джерел світла з використанням OpenGL
Створити тривимірну сцену. Користуючись графічними об'єктами бібліотеки GLUT (куля, конус, куб, тор, чайник і т.д.), створити у просторі графічні образи. Для елементів, з яких зібрані об'єкти, задати різні властивості матеріалу і різні режими відтворення полігонів (точками, лініями, суцільне заповнення).
Розмістити у довільних точках простору кілька джерел світла. Поставити характеристики джерел світла: одне джерело повинен бути точковий, один направлений (типу "прожектор"). Колір джерел підбирається з естетичних міркувань.
Поставити рух будь-яким об'єктам сцени. Рух бажано описувати деяким періодичним законом, щоб переміщення об'єктів носило циклічний характер і не вимагало перезапуску програми для демонстрації.


Бібліографічний список

1. Ейнджел Едвард. Інтерактивна комп'ютерна графіка. Вступний курс на базі OpenGL, 2 изд.: Пер. з англ. - М.: Видавничий дім «Вільямс», 2001.-592 с.: Іл.
2. Ву Мейсон, Нейдер Джекі, Девіс Том, Шрайнер Дейв. OpenGL. Офіційне керівництво програміста: Пер. з англ. СПб: ТОВ «ДіаСофтЮП», 2002. - 592 с.
3. Тихомиров Ю. Програмування тривимірної графіки - СПб.: BHV - Санкт-Петербург, 1998. - 256 с., Іл.
4. Краснов М. OpenGL. Графіка в проектах Delphi.-СПб.: БХВ - Санкт-Петербург, 2000.-352 с.: Іл.
5. Роджерс Д. Алгоритмічні основи машинної графіки: Пер. з англ. - М.: Світ, 1989. - 512 с., Мул
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
70.3кб. | скачати


Схожі роботи:
Тривимірна графіка Теорія
Тривимірна комп`ютерна графіка
Комп`ютерна графіка OpenGL
Етапи складання графіка документообігу і графіка облікових робіт на підприємстві
Етапи складання графіка документообігу і графіка облікових робіт
Випуклість і вгнутість графіка функції точки перегину Асимптоти графіка функції Схема дослідж
Використання OpenGL
Графічна бібліотека OpenGl
Концепції програмування Графічна система OpenGL
© Усі права захищені
написати до нас