Геометричні перетворення в тривимірному просторі 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Геометричні перетворення в тривимірному просторі



Лінійні геометричні перетворення у тривимірному просторі виконуються з допомогою множення матриці відповідного перетворення на вектори всіх вершин та нормалей полігональної моделі.

При цьому використовуються афінні однорідні координати V(x1, x2, x3, x4), які пов’язані зі звичайними декартовими співвідношеннями: x = x1 / x4, y = x2 / x4, z = x3 / x4,

x4 –довільне, в нормалізованій формі x4=1.

Афінні однорідні координати записують також у вигляді

V(x / w, y / w, z / w, w) або V(x, y, z, 1).

Матриці геометричних перетворень в афінній геометрії мають розміри 4х4.

З курсу аналітичної геометрії відомо, що будь-яке лінійне геометричне перетворення можна представити, як транспозицію (послідовність) елементарних (базисних) перетворень.

Повний набір базисних перетворень можна побудувати різними способами. В комп’ютерній графіці для тривимірного випадку прийнятий такий набір елементарних перетворень:

· поворот на кут α навколо ОХ в площині YOZ;

· поворот на кут β навколо ОY в площині XOZ;

· поворот на кут γ навколо ОZ в площині XOY;

· масштабування (розтягування або стискання) з коефіцієнтами r,s,t по осях;

· перенесення на вектор (a, b, c);

· відзеркалення відносно координатної площини XOY;

· відзеркалення відносно координатної площини YOZ;

· відзеркалення відносно координатної площини XOZ.

В OpenGL під час виконання програми використовується три матриці: модельна (для геометричних перетворень вершин і нормалей), видоваматриця (для проектування у вікно виведення) та матриця текстур.

Для роботи з відповідною матрицею її потрібно активізувати командою glMatrixMode (mode) з параметром mode рівним GL_MODELVIEW, GL_PROJECTION або GL_TEXTURE.

Для завантаження елементів активної матриці використовується команда glLoadMatrix[f d](@ m), де @m вказує на масив з 16 елементів типу GLfloat або GLdouble відповідно до суфікса команди. В масиві записується матриця по стовпцях. Команда glLoadIdentity записує в активну матрицю одиничну.

Для запам’ятовування поточної активної матриці використовується стек матриць. Для збереження поточного стану (запис в стек) використовується команда glPushMatrix, для відновлення збереженого glPopMatrix. Для видової матриці глибина стека дорівнює як мінімум 32, а для двох інших – як мінімум 2.

Для множення поточної матриці зліва на іншу використовується команда glMultMatrix[f d](@ m).

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

· Перенесення на вектор(x,y,z):

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

· Поворот на кут angle навколо осі, яка проходить через початок координат і точку з координатами (x,y,z):

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

· Масштабування (розтягування чи стискання)

з коефіцієнтами x, y, z по осях:

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

Лінійні геометричні перетворення використовуються для побудови конструкцій із найпростіших фігур (геометричних примітивів) з допомогою масштабування, повороту та перенесення, для анімації - переміщення об’єктів в просторі, зміна розмірів, зміна положення системи координат, зміна точки зору (камери).

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

Додатній напрям поворотів відповідає напряму проти годинникової стрілки, якщо дивитись на площину обертання з додатнього напряму відповідної осі.

· поворот на кут α навколо ОХ в площині YOZ

glRotate(α*Pi/180, 1, 0, 0), α в радіанах

· поворот на кут β навколо ОY в площині XOZ

glRotate(β*Pi/180, 0, 1, 0), β в радіанах

· поворот на кут γ навколо ОZ в площині XOY

glRotate(γ *Pi/180, 0, 0, 1), γ в радіанах

· деформація (розтяг чи стискання) з коефіцієнтами r,s,t по осях

GlScale(r, s, t)

· перенесення на вектор (a, b, c)

GlTranslate(a, b, c)

· віддзеркалення відносно координатної площини XOY

GlScale(1, 1, -1)

· віддзеркалення відносно координатної площини XOZ

GlScale(1, -1, 1),

· віддзеркалення відносно координатної площини YOZ

GlScale(-1, 1, 1),


Крім афінних часто використовуються такі перетворення:

· віддзеркалення відносно початку координат O

GlScale(-1, -1, -1),

· поворот на кут α навколо вектора (x, y, z), що проходить через точку з координатами (a,b,c) здійснюється за три кроки:

1) перенесення центру координат на вектор (a, b,c)

GlTranslate(a, b, c).

2) поворот на кут α навколо вектора (x, y, z)

glRotate(α*Pi/180, x, y, z);

3) повернення центру координат до початкового положення

glTranslate(-a, -b, -c);

Матриця перетворення дорівнює добутку матриць відповідних перетворень.

Зауваження. Перетворення віддзеркалення змінюють напрям обходу вершин граней на протилежний, тобто лицьові грані стають нелицьовими і навпаки. Напрям обходу вершин лицьових сторін вказується командою glFrontFace (mode) зі значенням параметра mode рівним GL_CW (за годинниковою стрілкою) або GL_CCW (проти годинникової стрілки). Значення за замовчуванням GL_CCW. Для симетричних фігур замість віддзеркалення краще використовувати поворот на 180°.

Приклад 7.1. Побудова комбінованого многогранника (рис.7.1) з допомогою трансформації кубів.

В даному розділі використовуються приклади трансформації найпростішої фігури – куба з ребром а = 2, який будується в центрі координат з різнокольоровими гранями процедурою з попередньої роботи DrawSolidCube. Для побудови куба з однаково зафарбованими гранями викорисовується процедура glutSolidCube(size) з бібліотеки DGLUT.PAS.

Перший спосіб. Шість кубів.

procedure Draw3D;

Begin

glPushMatrix; // поточна модельна матриця =>в стек



Поделиться:


Последнее изменение этой страницы: 2016-04-08; просмотров: 818; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.251.68 (0.01 с.)