ГЕОМЕТРИЧНІ ПЕРЕТВОРЕННЯ В ТРИВИМІРНОМУ ПРОСТОРІ

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

При цьому використовуються афінні однорідні координати 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; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь