РОЗДІЛ 10. КВАДРАТИЧНІ ПОВЕРХНІ. ПОЛІГОНАЛЬНА МОДЕЛЬ ТОРА. МОДЕЛЮВАННЯ ВЛАСТИВОСТЕЙ


П.В.ОЛЬШАНСЬКИЙ

ПРАКТИКУМ

Частина ІІ


Зміст

РОЗДІЛ 6. ПРАВИЛЬНІ МНОГОГРАННИКИ (ТІЛА ПЛАТОНА)….3

РОЗДІЛ 7. ГЕОМЕТРИЧНІ ПЕРЕТВОРЕННЯ В ТРИВИМІРНОМУ ПРОСТОРІ…………………………………………………………………..19

РОЗДІЛ 8. НАПІВПРАВИЛЬНІ МНОГОГРАННИКИ………………...29

РОЗДІЛ 9. ЗІРЧАСТІ МНОГОГРАННИКИ…………………………......39

РОЗДІЛ 10. КВАДРАТИЧНІ ПОВЕРХНІ. ПОЛІГОНАЛЬНА МОДЕЛЬ ТОРА. МОДЕЛЮВАННЯ ВЛАСТИВОСТЕЙ

МАТЕРІАЛУ, ОСВІТЛЕНОСТІ, ЕФЕКТУ ТУМАНУ………………..47

РОЗДІЛ 11. ПОЛІГОНАЛЬНІ МОДЕЛІ СФЕРИ.

ТЕКСТУРУВАННЯ СФЕРИ……………………………………………...57

РОЗДІЛ 12. ЦИЛІНДРИЧНІ, КОНІЧНІ, ПАРАБОЛІЧНІ, ГІПЕРБОЛІЧНІ ПОВЕРХНІ……………………………………………..71

 


РОЗДІЛ 6

ПРАВИЛЬНІ МНОГОГРАННИКИ (ТІЛА ПЛАТОНА)

Правильними називаються многогранники, які допускають дві симетрії: циклічну перестановку вершин та циклічну перестановку граней, що сходяться до однієї вершини. Звідси слідує, що всі грані рівні та правильні, всі ребра рівні і всі вершини мають однакове оточення. Існує п’ять правильних многогранників (доведено Евклідом):

· правильний чотиригранник – тетраедр, утворений чотирма правильними трикутниками;

· правильний шестигранник – гексаедр (куб), утворений шістьма правильними. чотирикутниками (квадратами);

· правильний восьмигранник – октаедр, утворений вісьмома правильними трикутниками;

· правильний двадцятигранник – ікосаедр, утворений двадцятьма правильними трикутниками;

· правильний дванадцятигранник – додекаедр, утворений дванадцятьма правильними п’ятикутниками.

Рис.6.1. Правильні многогранники (тіла Платона).

Рівняння Ейлера для правильних многогранників

Г+В=Р+2.

В “Началах” Евкліда викладкні відомості для повного вивчення правильних многогранників. Починає свій трактат Евклід з побудови рівностороннього трикутника, а закінчує побудовою додекаедра. Прийнята назва цих многогранників не пов’язана із заслугами Платона в цій області. Найбільш рання відома робота, в якій детально вивчались правильні тіла, належить другу Платона Теетету. Древні греки надавали правильним многогранникам містичне значення і пов’язували з чотирма многогранниками чотири стихії, а додекаедр зі Всесвітом.

Таблиця 6.1. Геометричні параметри тіл Платона.

  Тіло Платона Граней Вершин Ребер
Тетраедр
Гексаедр (куб)
Октаедр
Ікосаедр
Додекаедр

В розширеннях графічної бібліотеки OpenGL є набір процедур для побудови правильних многогранників. Наприклад, бібліотеки GLUT та DGLUT містять процедури для побудови каркасних (дротяних) та суцільних тіл Платона.

Куб (дротяний –Wire або суцільний - Solid):

procedure glutWireCube(Size : GLDouble);

procedure glutSolidCube(Size : GLDouble);

Тетраедр (дротяний –Wire або суцільний - Solid):

procedure glutWireTetrahedron;

procedure glutSolidTetrahedron;

Октаедр (дротяний –Wire або суцільний - Solid):

procedure glutWireOctaheadron;

procedure glutSolidOctaheadron;

Ікосаедр (дротяний –Wire або суцільний - Solid):

procedure glutWireIcosahedron;

procedure glutSolidIcosahedron;

Додекаедр (дротяний –Wire або суцільний - Solid):

procedure glutWireDodecahedron;

procedure glutSolidDodecahedron;

 

При використанні процедур для побудови примітивів із стандартних бібліотек неможливо задати чи змінити властивості окремих граней чи потрібний в конкретних випадках спосіб накладання текстур. Створення власної бібліотеки процедур для побудови многогранників важливе в навчальних цілях для розвитку просторового мислення, дає можливість оптимізувати сцени в складних 3D-проектах з допомогою ретельного аналізу граней, нормалей, текстур і симетрії.

Для прискорення числові параметри в командах OpеnGL найчастіше передають з допомогою вказівників на вектори.

Type // задаємо типи даних

V_Array=array[0..2]of GLfloat;//координати вершин

N_Array= V_Array; //координати нормалей

C_Array=array[0..2]of GLfloat; //компоненти кольору

Побудову набору правильних многогранників починають, як правило, з найбільш простої фігури – куба.

Виведення грані куба (чотирикутника) з врахуванням нормалі і кольору виділяємо в окрему процедуру

procedure Edge4(V1,V2,V3,V4:V_Array;

N:N_Array; Color:C_Array);

begin glBegin (GL_QUADS); glColor3fv(@Color);

glNormal3fv(@N); glVertex3fv(@V1); glVertex3fv(@V2);

glVertex3fv(@V3); glVertex3fv(@V4); glEnd end;

Приклад 6.1. Процедура побудови зафарбованих граней куба(рис.1.2). Для правильного обчислення лицьових та нелицьових граней порядок слідування вершин задається в одному напрямі (за замовчуванням проти годинникової стрілки).

procedure DrawSolidCube;

// вершини куба // кольори задаються довільно

const A:V_Array=(1,1,1); // нормалі до граней

B:V_Array=(-1,1,1); N1:N_Array=(0,0,1);

C:V_Array=(-1,-1,1); N2:N_Array=(0,0,-1);

D:V_Array=(1,-1,1); N3:N_Array=(1,0,0);

A1:V_Array=(1,1,-1); N4:N_Array=(-1,0,0);

B1:V_Array=(-1,1,-1); N5:N_Array=(0,1,0);

C1:V_Array=(-1,-1,-1); N6:N_Array=(0,-1,0);

D1:V_Array=(1,-1,-1);


Var M1,M2,M3,M4,M5, M6,M7,M8,M9,M10,

M11,M12,M13,M14,M15,M16,M17,M18,M19,M20:V_Array;

procedure Middle(V1,V2,V3:V_Array;var M:V_Array);

begin M[0]:=(V1[0]+V2[0]+V3[0])/3;

M[1]:=(V1[1]+V2[1]+V3[1])/3;

M[2]:=(V1[2]+V2[2]+V3[2])/3 end;

Лабораторна робота №6

РОЗДІЛ 7

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; // поточна модельна матриця =>в стек

DrawSolidCube; // куб

DrawSolidCube; // куб

DrawSolidCube; // куб

DrawSolidCube; // куб

DrawSolidCube; // куб

DrawSolidCube; // куб

glPopMatrix { відновлення модельної матриці} end;

Рис.7.1. Шість кубів, зміщених від центру по півосях.

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

Перетворення розтягу/стискання змінює довжину нормалей, тому для уникнення неправильного моделювання освітленості потрібно ввімкнути режим нормалізації нормалей.

Другий спосіб. Три паралелепіпеди.

procedure Draw3D;

DrawSolidCube; // куб

DrawSolidCube; // куб

DrawSolidCube; // куб

glPopMatrix; // модельна матриця <= зі стеку

glDisable(GL_NORMALIZE) end;

Рис.7.2. Комбінація трансформованих кубів

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

procedure Draw3D; var i,j :integer;

begin glEnable(GL_NORMALIZE);

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

for j:=1 to 12 do

begin glTranslate(0,0,0.6);

glRotate(15,0,0,1); glScale(0.8,0.8,1);

glPushMatrix; // матриця 1 =>в стек

for i:=1 to 6 do

begin glRotate(30,0,0,1);

glPushMatrix; // матриця 2 =>в стек

glScale(3.0,0.2,0.4); DrawSolidCube;

glPopMatrix; // матриця 2 <= зі стеку

end;

glPopMatrix; // матриця 1 <= зі стеку

end; glPopMatrix;// матриця 0 <= зі стеку

glDisable(GL_NORMALIZE) end;

Лабораторна робота №7

В тривимірному просторі

Завдання 7.1.З допомогою демопрограми transformations ознайомитись з параметрами та особливостями виконання команд зсуву, повороту та масштабування. Числові параметри змінюються лівою кнопкою мишки. Об’єкти змінюються з допомогою контекстного меню. Зберегти скріншоти.

Завдання 7.2.Скопіювати файли проекту із завдання 5.1 в нову папку. Скласти алгоритм побудови фігури з допомогою трансформації кубів (рис.7.3-7.14).

Рис.7.3. Варіант 1 Рис.7.4. Варіант 2 Рис.7.5. Варіант 3

Рис.7.6. Варіант 4 Рис.7.7. Варіант 5 Рис.7.8. Варіант 6

Рис.7.9. Варіант 7 Рис.7.10. Варіант 8 Рис.7.11. Варіант 9

Рис.7.12. Варіант 10 Рис.7.13. Варіант 11 Рис.7.14. Варіант 12

Завдання для самостійної роботи

Завдання 7.3.Скласти рекурсивний варіант алгоритму із завдання 7.2.

Завдання 7.4.Скласти програму для побудови однієї з тривимірних моделей, зображених на рис.7.15-7.26.

Рис.7.15. Рис.7.16.

Рис.7.17. Рис.7.18.

Рис.7.19. Рис.7.20.

Рис.7.21. Рис.7.22.

Контрольні запитання

1. З якою метою в комп’ютерній графіці використовуються афінні координати? Які матриці використовується в OpenGL?

2. Побудуйте обернені матриці для афінних перетворень. Запишіть відповідні команди OpenGL.

3. Якими командами можна трансформувати правосторонню систему координат в лівосторонню?

4. Для чого потрібен стек матриць? Назвіть команди OpenGL для роботи зі стеком. Чому глибина стека модельної матриці набагато більша глибини інших?

5. Що відбувається у випадку переповнення стека матриць? У випадку спроби читання даних з пустого стека?

6. Чому кількість викликів командиglPushMatrix повинна дорівнювати кількості викликів командиglPopMatrix? Чи можна їх міняти місцями?

7. Як ітераційний алгоритм переробити на еквівалентний рекурсивний?

8. Чи можна з допомогою лінійних перетворень перетворити куб в зрізану піраміду?


РОЗДІЛ 8

Лабораторна робота №8

РОЗДІЛ 9

ЗІРЧАСТІ МНОГОГРАННИКИ

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

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

Правильні зірчасті многогранники – зірчасті многогранники, гранями яких є одинакові правильні чи зірчасті многокутники. Коші довів, що існує лише чотири правильних зірчастих тіла, які не є об’єднаннями платонових і зірчастих тіл. Їх називають тілами Кеплера-Пуансо(рис.9.1): всі 3 зірчасті форми додекаедра і одна з зірчастих форм ікосаедра. Інші правильні зірчасті многогранники є об’єднаннями тіл Платона чи тіл Кеплера-Пуансо.

Рис 9.1. Тіла Кеплера-Пуансо.

Тетраедр і куб не мають зірчастих форм, бо їх грані при продовженні не перетинаються.

Октаедр має тільки одну зірчасту форму (рис.9.2), відкриту Леонардо да Вінчі, потім перевідкриту Йоганном Кеплером і названу Stella octangula (зірка восьмикутна).

Вона є об’єднанням двох тетраедрів. Рис. 9.2.

Приклад 9.1. Процедура побудови зірчастого октаедра(рис.9.2).

procedure StellaOctangula;

begin glPushMatrix; DrawSolidTetrahedron;

glScale(-1,-1,-1); DrawSolidTetrahedron;

glPopMatrix end;

Додекаедр має 3 зірчасті форми (рис.9.1): малий зірчастий додекаедр, великий додекаедр, великий зірчастий додекаедр.

Ікосаедр має 59 зірчастих форм. Одна з них називається великим ікосаедром (рис.9.1) і є одним з чотирьох правильних зірчастих многогранників Кеплера—Пуансо.

Рис. 9.3. Зірчасті форми кубоктаедра.

Кубоктаедр має 4 зірчасті форми (рис.9.3). Перша з них є об’єднанням куба і октаедра.

Begin // 5 верхніх граней

Edge3( V11, V2, V6, M3, C_Navy);

Edge3( V11, V4, V8, M5, C_Navy);

Edge3( V11, V6, V10,M7, C_Navy);

Edge3( V11, V8, V2, M9, C_Navy);

Edge3( V11, V10,V4, M1, C_Navy);

Edge3( V12, V5, V1, M2, C_Navy); // 5 нижніх граней

Edge3( V12, V7, V3, M4, C_Navy);

Edge3( V12, V9, V5, M6, C_Navy);

Edge3( V12, V1, V7, M8, C_Navy);

Edge3( V12, V3, V9, M10,C_Navy);

Edge3( V2, V9, V5, M11,C_Navy); // 10 бічних граней

Edge3( V1, V8, V4, M20,C_Navy);

Edge3( V4, V1, V7, M12,C_Navy);

Edge3( V3, V10,V6, M16,C_Navy);

Edge3( V6, V3, V9, M13,C_Navy);

Edge3( V5, V2, V8, M17,C_Navy);

Edge3( V8, V5, V1, M14,C_Navy);

Edge3( V7, V4,V10, M18,C_Navy);

Edge3( V10, V7, V3, M15,C_Navy);

Edge3( V9, V6, V2, M19,C_Navy) end;

Рис. 9.10. Великий Рис.9.11. Об’єднання Рис.9.12. Об’єднання

ікосаедр. двох ікосаедрів п’яти ікосаедрів

Лабораторна робота №9

РОЗДІЛ 10

КВАДРАТИЧНІ ПОВЕРХНІ

ПОЛІГОНАЛЬНА МОДЕЛЬ ТОРА

Const // колір туману

fog_color:array[0..3] of GLFloat =(0.9,0.9,1.0,0.0);

glEnable(GL_FOG); // вмикаємо режим туману

// задаємо лінійну функцію зростання густини туману

glFogi(GL_FOG_MODE, GL_LINEAR);

glFogfv(GL_FOG_COLOR, @FOG_COLOR); // колір туману

glFogf(GL_FOG_DENSITY,0.5);// задаємо густину туману

// відстань від початку туману до камери

glFogf(GL_FOG_START, 6);

// відстань від кінця туману до камери

glFogf(GL_FOG_END, 10);

Рис.10.8. Додавання ефекту серпанку (туману).

Побудова частин тора.Для побудови частини тора потрібно додати до вищенаведеної процедури DrawTorпараметри part1Î[0.0,1.0]та part2Î[0.0,1.0].

procedure DrawTor(part1, part2, R1,R2:GLfloat;

n1,n2,k1,k2:GLint);

та змінити delta_fi := 2*pi/n1*part1,

delta_teta := 2*pi/n2*part2.

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

Рис.10.9. Побудова частини тора двома площинами відсікання.

Лабораторна робота №10

РОЗДІЛ 11

ПОЛІГОНАЛЬНІ МОДЕЛІ СФЕРИ

ТЕКСТУРУВАННЯ СФЕРИ

Сфера. Для побудови зображення сферичної поверхні можна використати процедуру для побудови тора з попереднього розділу (приклад 10.1) з радіусом великого кола R=0 (рис.11.1). Однак при перетворенні тора в сферу відбувається повторне виведення, тобто накладаються дві сфери. Тому доцільно побудувати окрему оптимальнішу процедуру.

Рис.11.1. Текстурована модель сфери, одержана процедурою побудови тора.

Var // вершини ікосаедра

V1 : V_Array=( 0, -1, 0.5);

V2 : V_Array=( sin36, -cos36, -0.5);

V3 : V_Array=( sin72,-cos72, 0.5);

V4 : V_Array=( sin72, cos72, -0.5);

V5 : V_Array=( sin36, cos36, 0.5);

V6 : V_Array=( 0, 1, -0.5);

V7 : V_Array=(-sin36, cos36, 0.5);

V8 : V_Array=(-sin72, cos72, -0.5);

V9 : V_Array=(-sin72,-cos72, 0.5);

V10: V_Array=(-sin36,-cos36, -0.5);

V11: V_Array=( 0, 0, q5div2);

V12: V_Array=( 0, 0, -q5div2);

Вектор вершини використовується в полігональних моделях сфери також в якості нормалі відповідної вершини. Тому для спрощення алгоритму вищенаведені вектори вершин ікосаедра нормалізуються процедурою

procedure Normalize; {викликається в OnCreate}

procedure N(var V:V_Array);

const d= 1.118033989; { d=sqrt(1.25)}

begin V[0]:=V[0]/d; V[1]:=V[1]/d; V[2]:=V[2]/d end;

Лабораторна робота №11

Завдання 11.1. Геосфера.

Скопіювати файли проекту із завдання 10.6 в нову папку. Додати процедуру побудови текстурованої сфери (приклад 11.1).

Підготувати текстуру із зображенням земної поверхні (рис.11.4) розмірами 1024х512 або 2048х1024 пікселів з глибиною кольору 24 біти. Задати розміри і назву файла, змінити точку зору і задати напрям обертання навколо вертикальної осі. Тонкий шар атмосфери навколо земної кулі зімітувати з допомогою ефекту туману на границі між сферою і темним фоном (приклад 10.3). Підібрати розташування тонкого шару туману (початок і закінчення) поблизу перерізу, який відповідає силуету.

Нанести на зображення сфери сітку з меридіанами та паралелями. Для нанесення сітки з меридіанів і паралелей (рис.11.6) потрібно після виведення текстурованої сфери відключити текстуру, задати колір і товщину ліній, режим виведення многокутників у вигляді ліній та повторно вивести сферу більшого радіуса. Скріншоти зберегти в звіті. Всі файли проекту зберегти в окремій папці для звіту.

Завдання 11.2. Геосфера з напівпрозорою текстурою хмарного покриття.Скопіювати програму із завдання 11.1 в нову папку. Додати процедури для роботи з двома текстурами з прикладу 4.2 та для роботи з напівпрозорими текстурами з прикладу 4.6.

В графічному редакторі розмістити зображення хмарного покриття (рис.11.8) на фоні чорного кольору, який відповідатиме прозорим ділянкам. Вивести напівпрозору текстуру на сферу більшого радіуса. Для сфери з хмарним покриттям додати додаткове обертання.

Завдання 11.3.Скласти програму для побудови тривимірної моделі фігури згідно варіанту (рис.11.14-11.25). Скріншоти зберегти в звіті.

Рис.11.14. Варіант 1 Рис.11.15. Варіант 2 Рис.11.16. Варіант 3

Рис.11.17. Варіант 4 Рис.11.18. Варіант 5

Рис.11.19. Варіант 6 Рис.11.20. Варіант 7

Рис.11.21. Варіант 8 Рис.11.22. Варіант 9

 

Рис.11.23. Варіант 10 Рис.11.24. Варіант 11 Рис.11.25. Варіант 12

Завдання для самостійної роботи

РОЗДІЛ 12

Лабораторна робота №12

П.В.ОЛЬШАНСЬКИЙ

ПРАКТИКУМ

Частина ІІ


Зміст

РОЗДІЛ 6. ПРАВИЛЬНІ МНОГОГРАННИКИ (ТІЛА ПЛАТОНА)….3

РОЗДІЛ 7. ГЕОМЕТРИЧНІ ПЕРЕТВОРЕННЯ В ТРИВИМІРНОМУ ПРОСТОРІ…………………………………………………………………..19

РОЗДІЛ 8. НАПІВПРАВИЛЬНІ МНОГОГРАННИКИ………………...29

РОЗДІЛ 9. ЗІРЧАСТІ МНОГОГРАННИКИ…………………………......39

РОЗДІЛ 10. КВАДРАТИЧНІ ПОВЕРХНІ. ПОЛІГОНАЛЬНА МОДЕЛЬ ТОРА. МОДЕЛЮВАННЯ ВЛАСТИВОСТЕЙ

МАТЕРІАЛУ, ОСВІТЛЕНОСТІ, ЕФЕКТУ ТУМАНУ………………..47









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

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