Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка комR_А5.doc
Скачиваний:
5
Добавлен:
09.11.2019
Размер:
419.84 Кб
Скачать

Видові перетворення

До видових перетворень відноситимемо перенесення, поворот і зміну масштабу уздовж координатних осей. Для проведення цих операцій досить помножити на відповідну матрицю кожну вершину об'єкту і отримати змінені координати цієї вершини :

(x’, y’, z’, 1)T = M * (x, y, z, 1)T

де M - матриця видового перетворення. Перспективне перетворення і проектування робиться аналогічно. Сама матриця може бути створена за допомогою наступних команд:

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

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

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

glTranlsate..() робить перенесення об'єкту, додаючи до координат його вершин значення своїх параметрів.

glRotate..() робить поворот об'єкту проти годинникової стрілки на кут angle (вимірюється в градусах) навколо вектору (x, y, z).

glScale..() робить масштабування об'єкту (стискування або розтягування), домножуючи відповідні координати його вершин на значення своїх параметрів.

Усі ці перетворення застосовуватимуться до примітивів, описи яких знаходитимуться нижче в програмі. У випадку якщо потрібно, наприклад, повернути один об'єкт сцени, а іншій залишити нерухомим, зручно спочатку зберегти поточну видову матрицю в стеку командою 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) сцена буде перевернута.

Фактично, ця команда здійснює перенесення і поворот об'єктів сцени, але у такому вигляді задавати параметри буває зручніше.

Проекції

В 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, - near) і (right, top, - near), які відповідають лівому нижньому і правому верхньому кутам вікна виводу. Параметри near і far задають відстань до ближньої і далекої площин відсікання по дальності від точки (0,0,0) і можуть бути негативними.

У другій команді, на відміну від першої, значення near і far встановлюються рівними – 1 і 1 відповідно.

Перспективна проекція визначається командою

void gluPerspective (GLdouble angley, GLdouble aspect, GLdouble znear, GLdouble zfar)

яка задає усічений конус видимості в лівобічній системі координат. Параметр angley визначає кут видимості в градусах по осі у і повинен знаходитися в діапазоні від 0 до 180. Кут видимості уздовж осі x задається параметром aspect, який зазвичай задається як відношення сторін області виводу. Параметри zfar і znear задають відстань від спостерігача до площин відсікання по глибині і мають бути позитивними. Чим більше відношення zfar/znear, тим гірше в буфері глибини розрізнятимуться розташовані рядом поверхні, оскільки за умовчанням в нього записуватиметься 'стисла' глибина в діапазоні від 0 до 1 (див. наступний пункт).