Методи програмування динамічних зображень 


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



ЗНАЕТЕ ЛИ ВЫ?

Методи програмування динамічних зображень



Анімацією називають вивід що змінюється, динамічного зображення. Ілюзію зображення, що рухається, створює перегляд послідовності нерухомих зображеннь-кадрів, що показують різні фази руху. Щоб вивести на екран дисплея динамічне зображення, треба запрограмувати вивід послідовності кадрів. Швидкість зміни кадрів при цьому повинна бути досить великою. Якщо кожний кадр містить складне зображення, що складається з великої кількості графічних елементів, вирішити проблему швидкого виведення кадрів на екран непросто.

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

 

 (1.38)

 

де а – амплітуда, a t – параметр, що грає роль часу. Анімація використається для виведення тимчасової залежності графіка функції. Оскільки мова йде про вивід тривимірного об’єкта, необхідно вибрати проекцію, наприклад симетричну поверхня зображується лініями її перетинання із площинами, паралельними площинам х0z і у0z. Через певний час попереднє зображення "затирається" чорними кольорами. При цьому спостерігається неприємне мерехтіння екрана.

Позбутися від зазначеного недоліку можна, використовуючи сторінки відеопам’яті. Організація відеопам’яті така, що в деяких режимах роботи відеоадаптера є кілька сторінок відеопам’яті. На екрані дисплея відображається тільки одна з них, а всі інші можуть бути в цей час використані для побудови чергового кадру анімаційного зображення [17].

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

Є й інші проблеми, які доводиться вирішувати при програмуванні динамічних зображень. Так, наприклад, переміщення об’єкта може відбуватися на тлі нерухомого зображення. При цьому необхідно тимчасово зберігати невидимі ділянки тла й відновлювати його після того, як об’єкт зміститься в нове положення. Одне з рішень даної проблеми полягає у використанні спрайтів – апаратних або програмних засобів формування динамічного зображення. Спрайт являє собою растрове зображення невеликого розміру, що може переміщатися по екрані незалежно від іншої "картинки". Спрайт накладається на основне зображення, перекриваючи його [15].

На сьогоднішній час для програмування 3d-анімації використовуються спеціалізовані програмні засоби, які в більшій мірі використовують можливості сучасних відеокарт, які самі проводять необхідні обрахунки вершин, обробляють зображення і виводять його на екран. Швидкість обрахунку необхідних операцій настільки велика, що практично є моментальною, швидкість зміни зображення на екрані відбувається швидше, ніж встигає це помітити людське око [15].

 


РОЗДІЛ ІІ. ПРАКТИЧНА РЕАЛІЗАЦІЯ 3D ОБ’ЄКТІВ ТА ДИНАМІЧНИХ ПОДІЙ

 

Модуль обробки 3d об’єктів

 

Для відображення можливостей роботи із об’ємними фігурами нами було створено відповідний модуль, що дає змогу:

- перетворювати 3d координати в 2d координати монітора;

- вибирати відповідну проекцію за бажанням користувача;

- повертати точку відносно центру координат;

- повертати точку відносно певного вектору;

- відображати на екрані лінію, точку задану відповідними просторовими координатами;

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

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

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

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

 

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 об’єктів, анімації. Адже більшість операцій відбувається саме із вершинами об’єкта, а даний модуль саме їх і описує.

 



Поделиться:


Последнее изменение этой страницы: 2020-03-02; просмотров: 119; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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