Смекни!
smekni.com

Програмування трьохмірної графіки та анімації засобами Turbo Pascal (стр. 4 из 5)

- проводити масштабування точок відносно початку координат;

- рухати точку у довільному напрямку.

Розглянемо більш детально даний модуль:

Перш за все, в ньому оголошено глобальні зміні, які відповідатимуть за координати точки в просторі, на екрані:

type vector=array[1..3] of Real;

projection=array[1..2] of vector;

type Toch2d=record

x,y:integer;

end;

type Toch3d=record

x,y,z:real;

end;

var

abs_x_center, abs_y_center: Integer;DriverP: Pointer;


Даний модуль містить ряд функцій, а саме, функції Procedure open_graph та Procedure close_graph відповідають за ініціалізацію та вихід із графічного режиму.

Процедура Procedure out_text_XY(ss: String; x,y:integer; color: Word) відповідає за відображення текстового рядка заданим кольором за відповідними координатами.

Процедура Procedure put_picxel(d2:Toch2d; color: Word) за координатами точки у двохвимірному просторі за заданим кольором відображає її на екран.

Процедура Procedure norm_line(d2_0,d2_1:Toch2d; color:word) за координатами 2 точок у двохвимірному просторі за заданим кольором будує на екран лінію.

Дані процедури побудовані на основі стандартних функцій.

Відповідно до формул 1.33 та 1.34 вибору проекцій відображення побудовані матриці перетворення в ізометричній, диметричній та ортогональній проекції. Дані матриці необхідні для переходу від 3d до 2d координат:

Procedure computer_isometric_matrix(var P:projection);

Begin

P[1,1]:=-1.0/Sqrt(2.0);

P[1,2]:=-P[1,1];

P[1,3]:=0.0;

P[2,1]:=-1.0/Sqrt(6.0);

P[2,2]:=P[2,1];

P[2,3]:=-2.0*P[2,1];

End;

Procedure computer_dimetric_matrix(alpha: Real; var P: projection);

Var

t: Real;

Begin

alpha:=pi*alpha/180.0;

P[1,1]:=-1.0/Sqrt(2.0);

P[1,2]:=-P[1,1];

P[1,3]:=0.0;

t:=Sin(alpha)/cos(alpha);

P[2,1]:=t*P[1,1];

P[2,2]:=P[2,1];

P[2,3]:=Sqrt(1.0-Sqr(t));

End;

Procedure computer_oblique_matrix(alpha: Real; var P: projection);

Begin

alpha:=pi*alpha/180.0;

P[1,1]:=-Sin(alpha);

P[1,2]:=1.0;

P[1,3]:=0.0;

P[2,1]:=-Cos(alpha);

P[2,2]:=0.0;

P[2,3]:=1.0;

End;

Процедура повороту точки відносно початку координат побудована у відповідності до формул 1.12 – 1.22 і має вигляд:

Procedure povorot(var mas:Toch3d; kx,ky,kz:real);

var tx,ty,tz,y,x,z:real;

Begin

tx:=mas.x;

ty:=mas.y*cos(kx*pi/180)+mas.z*sin(kx*pi/180);

tz:=mas.y*(-sin(kx*pi/180))+mas.z*cos(kx*pi/180);

y:=ty;

x:=tx*cos(ky*pi/180)+tz*(-sin(ky*pi/180));

z:=tx*sin(ky*pi/180)+tz*cos(ky*pi/180);

mas.z:=z;

mas.x:=x*cos(kz*pi/180)+y*sin(kz*pi/180);

mas.y:=-x*sin(kz*pi/180)+y*cos(kz*pi/180);

End;

У відповідності до формули 1.25 побудована процедура руху точки:

Procedure rux(var mas:Toch3d; dx,dy,dz:real);

Begin

mas.x:=mas.x+dx;

mas.y:=mas.y+dy;

mas.z:=mas.z+dz;

End;

У відповідності до формули 1.27 побудована процедура масштабування:

Procedure mach(var mas:Toch3d; mx,my,mz:real);

Begin

mas.x:=mas.x*mx;

mas.y:=mas.y*my;

mas.z:=mas.z*mz;

End;

Для переходу з трьохмірої моделі до двомірної використовується процедура project(const P:projection; const d3:Toch3d; const c:Toch2d; var d2:Toch2d), що за заданими координатами 3d точки та вибраною матрицею проекції проводить перевід у двовимірні координати монітору:

Procedure project(const P:projection; const d3:Toch3d; const c:Toch2d; var d2:Toch2d);

Begin

d2.x:=c.x+Round(P[1,1]*d3.x+P[1,2]*d3.y+P[1,3]*d3.z);

d2.y:=c.y+Round(P[2,1]*d3.x+P[2,2]*d3.y+P[2,3]*d3.z);

End;

Даного модуля в принципі достатньо для реалізації побудови 3d об’єктів, анімації. Адже більшість операцій відбувається саме із вершинами об’єкта, а даний модуль саме їх і описує.

2.2 Відображення об’ємних фігур в різних проекціях

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

Тетраедр задається чотирма своїми вершинами і почергово виводиться на екран.

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

d3:array[1..4] of Toch3d;

c:Toch2d;

d2:array[1..4] of Toch2d;

xstep,ystep,theta: Real;

i,j,xold,yold,xnew,ynew: Integer;

p:projection;

abs_x_center:= 0;

abs_y_center:= 0;

d3[1].x:=0;d3[1].y:=0;d3[1].z:=0;

d3[2].x:=0;d3[2].y:=0;d3[2].z:=50;

d3[3].x:=0;d3[3].y:=50;d3[3].z:=0;

d3[4].x:=50;d3[4].y:=0;d3[4].z:=0;

….

out_text_XY('Oblique Projection', -150, 150, Yellow);

draw_tetra;

Readln;

theta:=45;

repeat

computer_oblique_matrix(theta, P);

ClearViewPort;

draw_tetra;

theta:=theta+1;

until KeyPressed;

Дана програма дає можливість візуально побачити різницю між різними проекціями і вибрати оптимальну для користувача.

2.3 Побудова поверхонь

Для побудови поверхні була використана формула 1.38 і показана можливість її виведення 2 способами, стандартними засобами та із використанням сторінки відеопам’яті.

function f(x,y: Real): Real;

begin

f:=20*Sin(t*Sqrt(x*x+y*y));

end;

procedure anim(tt: Byte);

begin

ux:=Abs(b-a)/(nx-1);

uy:=Abs(d-c)/(ny-1);

d3.x:=a; d3.y:=c; d3.z:=f(d3.x,d3.y);

project(P,d3,cc,d2[1,1]);

d2[1,1].x:=d2[1,1].x+GetMaxX div 2;

d2[1,1].y:=GetMaxy div 2 - d2[1,1].y;

xmin:=d2[1,1].x; xmax:=xmin;

ymin:=d2[1,1].y; ymax:=ymin;

for i:=1 to nx do

begin

d3.y:=c;

for j:=1 to ny do

begin

d3.z:=f(d3.x,d3.y);

project(P,d3,cc,d2[i,j]);

d2[i,j].x:=d2[i,j].x+GetMaxX div 2;

d2[i,j].y:=GetMaxY div 2 - d2[i,j].y;

if xmin>d2[i,j].x then xmin:=d2[i,j].x

else if xmax<d2[i,j].x then xmax:=d2[i,j].y;

if ymin>d2[i,j].y then ymin:=d2[i,j].y

else if ymax<d2[i,j].y then ymax:=d2[i,j].y;

d3.y:=d3.y+uy;

end;

d3.x:=d3.x+ux;

end;

SetColor(tt);

for i:=1 to nx do

begin

MoveTo(d2[i,1].x,d2[i,1].y);

for j:=2 to ny do LineTo(d2[i,j].x,d2[i,j].y);

end;

for j:=1 to ny do

begin

MoveTo(d2[1,j].x,d2[1,j].y);

for j:=1 to nx do LineTo(d2[i,j].y,d2[i,j].x);

end;

end;

Begin

open_graph;

t:= 0;

theta:= 20;

repeat

computer_dimetric_matrix(theta, P);

anim(12);

anim(0);

t:=t+0.0001;

delay(10000);

until KeyPressed;

Відмінність у побудові поверхні із використанням відеопам’яті полягає в тому, що немає необхідності перемальовувати зображення щоразу, а просто зміннюючи відеосторінку, очищаємо її на активній малюємо малюнок і робимо її видимою:

SetGraphMode(VGAMed);

k:=1;

t:= 0;

theta:= 20;

repeat

computer_dimetric_matrix(theta, P);

k:=1-k;

SetActivePage(k);

ClearDevice;

anim(12);

SetActivePage(k);

t:=t+0.001;

until Keypressed;

2.4 Відсікання невидимих ліній, використання модуля Graph3d

Нижче, у відповідності до формул 1.35 – 1.37 реалізовано алгоритм відсікання невидимих частин алгоритмом сортування граней. Для цього використали побудову тетраедра. Перш ніж вивести на екран грань проводимо обрахунок чи є вона видима чи ні, і в залежності від результату проводимо прорисовку.

procedure draw_poly(j, color: Word);

var

vertex: array[1..3] of PointType;

i,k:Word;

begin

i:=1;

k:=1;

repeat

if i<>j then

begin

project(P,d3[i], c, d2[k]);

inc(k);

end;

Inc(i);

until k=4;

SetFillStyle(SolidFill, color);

FillPoly(3, d2);

end;

Для повного відображення можливостей модуля Graph3d було реалізовано ряд програм, зокрема: Surf3.pas – відображення рухомої поверхні подібної до розходження хвиль від джерела удару; Solar.pas – імітація руху планет навколо сонця, використовує диметричну проекцію та працює з використанням відеосторінок; MY_3D.pas – забезпечує реалізацію основних елементів перетворення у просторі а саме, клавіші відповідають:

- PgUp – поворот точок за годинниковою стрілкою навколо осі Z;

- PgDn – поворот точок проти годинникової стрілки навколо осі Z;

- Home– поворот точок за годинниковою стрілкою навколо осі X;

- End – поворот точок проти годинникової стрілки навколо осі X;

- Insert– поворот точок за годинниковою стрілкою навколо осі Y;

- Delete – поворот точок проти годинникової стрілки навколо осі Y;

- "Q" – рух по осі Z в додатному напрямку;

- "E" – рух по осі Z в протилежному напрямку;

- "W" – рух по осі Y в додатному напрямку;

- "S" – рух по осі Y в протилежному напрямку;

- "A" – рух по осі X в додатному напрямку;

- "D" – рух по осі X в протилежному напрямку;

- "+" – збільшити масштаб;

- "-" – зменшити масштаб.

Дана програма використовує диметричну проекцію побудови зображень та не використовує роботи з відеопам’яттю.

ВИСНОВКИ

Проаналізувавши проблему використання комп’ютерної графіки, зокрема об’ємних фігур, ролі анімації та методів її відображення і у відповідності до мети курсової роботи було виконано наступне:

1. проведено детальний аналіз літератури та Інтернет-джерел за темою "Тривимірна графіка. Анімація";2. виокремлення основних понять, формул і методів роботи із об’єктами у тривимірному просторі;3. проведено детальний аналіз розділу математики "Вектори, матриці", де було виокремлено основні поняття по роботі з векторами, матрицями, які спрощують розуміння учнями основних подій в 3d просторі;4. практично реалізовано основні алгоритми роботи по діям над точкою в просторі:

- рух;

- поворот;

- масштабування;

5. сформовано лекційний теоретичний матеріали.

Результатом роботи є лекційний курс по програмування тримірної графіки та методика відображення анімаційних проектів з допомогою стандартних засобів мови програмування Pascal, без використання сторонніх бібліотек. Даний лекційний курс побудований лише на математичних функціях і їх використанні на мові програмування. Він охоплює такі області як векторна, матрична математика. Даний курс доповнений реалізованими прикладами, що дають практичне уявлення про застосування математичних моделей у програмуванні, вчать аналітично реалізовувати поставленні завдання, покладаючись на різноманітні алгоритми та методи.Кінцевий продукт має практичну цінність у застосуванні при роботі із поєднання програмування із математикою, даючи наглядне розуміння взаємодії і використання математичних методів та фунцій, їх застосування на практиці.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Turbo Pascal – Издательская група К.: ВНV, 2000. – 320 с.

2. Абрамов В. Г. Введение в язык Pascal: Учебное пособие для студентов вузов по специальности Прикладная математика. – М.: Наука, 1988. – 158 с.

3. Абрамов С. А. Начала программирования на языке Pascal. - М.: Наука, 1987. – 126 с.

4. Аммерал А. Машинная графика на языке С, в 4-х томах, изд-во Сол. Систем, – 1992. – 230 с.

5. Власик А.П. Практикум з програмування в середовищі Turbo Pascal. – Рівне. – НУВГ,- 53 с.

6. Вэн-Дэм. А. Основы интерактивной машинной графики, т.1-2, М. Мир, 1985. – 257 с.

7. Гилой. Интерактивная машинная графика. – М., Мир, –1981. – 210 с.

8. Грайс. Графические средства персональных компьютеров. – М., – Мир, 1980. – 142 с.

9. Грис Д. Наука программирования. M.: Мир, 1984. – 230 с.