Лабораторна робота № 4. Тривимірні побудови. Буфер глибини. Видові параметри. Паралельна і перспективна проекції.
Мета роботи.
З'ясувати особливості тривимірного моделювання, побудови об'ємних зображень як проекцій на екранній плоскості; дати поняття про параметри вигляду.
Порядок виконання роботи.
Перед виконанням лабораторної роботи слід ознайомитися з необхідними теоретичними відомостями, що відносяться до можливостей тривимірного моделювання з використанням бібліотеки OPENGL. Рекомендується уважно вивчити теоретичний матеріал, що відноситься до різних способів проектування ([7] – лекція 15).
Завдання лабораторної роботи рекомендується виконувати в порядку їх проходження, відповідно до варіанту, вказаного викладача.
Необхідні теоретичні відомості.
Тривимірні координати.
У попередніх лабораторних роботах для малювання фігур використовувалася версія команди glVertex з двома параметрами. Координата по осі Z передбачалася рівною 0.
Для зображення в просторі використовується команда glVertex з трьома параметрами:
glVertex3f(<координата x>, <координата у>, <координата z>).
Значення координати Z лежить в межах від –1 до 1. За умовчанням вважається, що спостерігач розташований в крапці (0, 0, 0), що слід мати на увазі. Щоб вершини з позитивними координатами Z були змальовані, слід зрушити систему координат углиб екрану.
OPENGL відтворює тільки ті частки примітивів, координати яких не перевершують по модулю 1. Примітиви з однаковими координатами малюються за принципом: кожен подальший малюється поверх попереднього. Таке зображення не завжди дає правильні результати, зокрема, якщо не включена підтримка буфера глибини.
Буфер глибини.
Буфер глибини використовується для передачі простору. При відтворенні кожного піксела в цей буфер записується інформація про значення координати Z піксела, так звана віконна Z. Якщо на піксел доводиться декілька крапок, на екран виводиться крапка з найменшим значенням цієї координати.
Для правильної побудови зображень (відповідно до глибини) необхідно включити режим тестування глибини за допомогою команди:
glEnable(GL_DEPTH_TEST);
Код сцени слід починати з очищення двох буферів: буфера кадру і буфера глибини:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Точно так, як і перед черговою побудовою необхідно очистити поверхню малювання, для коректного відтворення потрібно очистити буфер простору.
Проекції.
Зображення тривимірних об'єктів на екрані будується за допомогою проекцій: паралельною (ортографічною) і перспективною.
При зображенні тривимірних об'єктів слід мати на увазі, що зображення будується в межах одиничного куба (координати по кожній з осей змінюються в межах від –1 до 1), причому початок координат (центр куба) знаходиться в центрі вікна, а вісь Z направлена перпендикулярно площині екрану у бік спостерігача. Спосіб проектування визначається вибором команди для установки параметрів вигляду:
glFrustum – вибирається перспективний спосіб проектування
glOrtho – вибирається паралельний спосіб проектування
При паралельному проектуванні зберігається паралельність прямих. Наприклад, при зображенні куба в паралельній проекції задня і передня грані будуть рівні.
При використанні перспективної проекції паралельні лінії об'єкту змальовуються такими, що сходяться в деякій видаленій («углиб» екрану) крапці, що і створює перспективу.
Параметри проектування відносяться до параметрів вигляду.
Видові параметри.
Окрім типа проекції зображення на екран, до видових параметрів відносять параметри, що визначають область відтворення в просторі. Все, що виходить за межі цієї області, відсікатиметься при відтворенні. Саме ці параметри і є аргументами команд glFrustum і glOrtho:
координата площини відсікання зліва;
координата площини відсікання справа;
координата площини відсікання знизу;
координата площини відсікання зверху;
відстань від спостерігача до ближньої площини відсікання;
відстань від спостерігача до далекої площини відсікання.
Слід мати на увазі, що для команди glFrustum 5-й і 6-й параметри завжди позитивні, а для команди glOrtho значення цих параметрів можуть бути і негативними.
Встановлювати видові параметри не обов'язково при кожному перемальовуванні екрану, досить робити це лише при зміні розмірів вікна (або при створенні нового вікна).
Прагніть передню і задню площини відсікання розташовувати так, щоб відстань між ними була мінімально можливою: чим менший об'єм обмежений цією площини, тим менше обчислень доводиться проводити OPENGL.
Як правило, при установці видових параметрів проводять і перенесення системи координат так, щоб всі крапки, що потрапляють в область відтворення. Звернете увагу на те, що в цьому випадку (проектування + перенесення) зона видимості розширюється.
Щоб змальована фігура виглядала просторовою, систему координат розвертають навколо осі X і навколо осі Y.
Місце команд в програмі.
Для того, щоб при кожній подальшому перемальовуванню екрану не відбувалася зміна розмірів сцени, пов'язана з перенесенням і проектуванням, слід використовувати видові команди по певних правилах.
Перший спосіб – використання команди glLoadIdentity:
glLoadIdentity; //Сброс всіх матриць в 1
glFrustum(-1, 1 -1, 1, 3, 10); //видовые параметри
glTranslatef(0.0, 0.0, -5.0); //начальный зрушення системи координат
glRotatef(30.0, 1.0, 0.0, 0.0); //поворот щодо осі X
glRotatef(70.0, 0.0, 1.0, 0.0); //поворот щодо осі Y
glBegin(.);
... // команди малювання
glEnd;
Другий спосіб – використання команд glPushMatrix і glPopMatrix:
glPushMatrix; //запоминаем поточну матрицю
glFrustum(-1, 1 -1, 1, 3, 10); //видовые параметри
glTranslatef(0.0, 0.0, -5.0); //начальный зрушення системи координат
glRotatef(30.0, 1.0, 0.0, 0.0); //поворот щодо осі X
glRotatef(70.0, 0.0, 1.0, 0.0); //поворот щодо осі Y
glBegin(.);
... // команди малювання
glEnd;
glPopMatrix; //восстанавливаем поточну матрицю
Матриця проектування.
Для коректного виконання операцій проектування використовується матриця проектування. Поточну матрицю проектування можна встановити за допомогою команди:
glMatrixMode(GL_PROJECTION);
Після виконання цієї команди слід встановити матрицю проектування в одиничну за допомогою команди glLoadIdentity.
Як правило, параметри вигляду поміщаються в обробнику зміни розмірів вікна, стартові зрушення і повороти зазвичай розташовуються тут же, а код відтворення сцени полягає між командами glPushMatrix і glPopMatrix. Інколи поступають інакше: код відтворення починається з glLoadIdentity, а далі йдуть стартові трансформації і власне код сцени.
Завдання до лабораторної роботи.
Завдання 1. Побудуйте зображення трьох плоских фігур в просторі (відповідно до варіанту). Оцініть отриманий результат: чи правильно замальовані фігури, якщо немає - поясніть чому.
Завдання 2. Встановіть режим перевірки буфера глибини в програмі до завдання 1. Порівняєте отриманий результат з попереднім.
Завдання 3. Встановіть видові параметри відповідно до варіанту і паралельну проекцію; побудуйте зображення куба з координатами вершин, рівними по модулю 1 (куб замальовується за допомогою 6 квадратів). Оціните результат.
Завдання 4. Встановіть перспективну проекцію і побудуйте каркасне зображення куба
Завдання 5. Поверніть осі координат відповідно до варіанту і побудуйте зображення куба. Оціните результат. Чому частки куба відсічені? Змініть видові параметри так, щоб куб замальовувався без відсікань. Змініть код програми так, щоб кожна грань куба замальовувалася своїм кольором.
Завдання 6. Напишіть програму, в якій зображення куба змінюється при натисненні клавіш (відповідно до варіанту).
Варіанти завдань.
Варіант 1

Фігури
(задані вершинами)

Параметри вигляду

Поворот осей

До завдання 6



Трикутник:
(0, 0.3, 0.2) (0.3, 0.3, 0) (0, 0, 0.7)
Квадрат:
(-0.5, 0.5, 0.3) (-0.5, -0.5, 0.3)
(0.5, -0.5, 0.3) (0.5, 0.5, 0.3)
Трикутник:
(0, 0, 0.3) (0.4, 0, 0.5) (-0.5, 05, -1)

-0.7, 0.7
-0.85, 0.85
3, 10

Навколо OX:
30
Навколо OY:
70

Змінюється спосіб зображення: каркасне або заливка кольором

Варіант 2

Фігури
(задані вершинами)

Параметри вигляду

Поворот осей

До завдання 6



Чотирикутник:
(-0.5, -0.5, -0.5) (-0.5, 0.5, -0.5)
(0.8, 0.5, -0.5) (0.5, -0.8, -0.5)
Трикутник:
(-1, -1, 1) (-1, 1, 1) (1, 0, -1);
Трикутник:
(-0.7, -0.7, -0.7) (0, 0, 0) (0, 0, 1)

-0.9, 0.8
-0.8, 0.9
5, 10

Навколо OX:
45
Навколо OY:
45

Змінюється масштаб: збільшення або зменшення об'єкту

Варіант 3

Фігури
(задані вершинами)

Параметри вигляду

Поворот осей

До завдання 6



Трикутник:
(1, 1, 0) (1, 0, 1) (0, 1, 1)
Чотирикутник:
(0.8, 0.7, 1) (-0.8, 0.7, 1)
(-0.8, -0.7, -0.8) (0.8, -0.7, -0.8)
Трикутник:
(0, 0.5, -0.5) (-0.5, 0, -0.5) (0.5, 0, 0.5)

-0.85, 0.85
-0.7, 0.7
6, 12

Навколо OX:
-25
Навколо OY:
60

Куб повертається при натисненні на деяку клавішу на заданий кут

Варіант 4

Фігури
(задані вершинами)

Параметри вигляду

Поворот осей

До завдання 6



Трикутник:
(1, 1, 1) (-1, 0, -1) (1, -1, 1)
Трикутник:
(-0.7, -0.7, 0) (-0.7, 0.7, 0) (0.7, 0, 0)
Трикутник:
(0, 0, -0.9) (-1, -0.8, 0.5) (1, 1, 1)

-0.8, 0.8
-0.9, 0.9
3, 8

Навколо OX:
-15
Навколо OY:
65

Куб переміщається: видалення або наближення

Варіант 5

Фігури
(задані вершинами)

Параметри вигляду

Поворот осей

До завдання 6



Квадрат:
(-0.6, -0.6 , -0.2) (0.6, -0.6, -0.2)
(0.6, 0.6, -0.2) (-0.6, 0.6, -0.2)
Квадрат:
(-0.5, 0.8, -0.8) (-0.5, 0.8, 0.8)
(-0.5, -0.8, 0.8) (-0.5, -0.8, -0.8)
Трикутник:
(-1, -1, 0) (0, 1, 1) (1, 0, 0)

-1, 0.9
0.9, 1
2, 9

Навколо OX:
35
Навколо OY:
50

Змінюється спосіб проектування: пряма або перспективна проекції

Додаткові завдання.
Напишіть програму для побудови тетраедра у вибраній проекції, користуючись командою малювання стрічки трикутників. Реалізуйте зображення тетраедра а) каркасний; б) із заливкою так, щоб лицьові грані змальовувалися червоним кольором, а зворотні – синім.
Змалювати октаедр. Реалізуйте обертання октаедра щодо його центру симетрії.
Змалювати тривимірні сходи, користуючись операцією зрушення.
Змалювати гвинтові сходи.
Контрольні питання.
Для чого застосовується буфер глибини?
Яким чином виводяться фігури при відключеному тесті глибини?
Які способи проектування існують?
Чим відрізняються різні способи проектування?
Який спосіб проектування доцільно використовувати для побудови реалістичних зображень?
Який спосіб проектування зручний при побудові креслень?
Що таке видові параметри і як вони застосовуються?
З якою метою в командах, що встановлюють видові параметри, використовується плоскість відсікання?