Смекни!
smekni.com

3D-формати і їх застосування (стр. 2 из 2)

Класифікація форматів

Формати графічних файлів можна класифікувати за різними ознаками. Наприклад, ці формати можна розділити на такі два класи:

• ті, що кодують тільки одне зображення;

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

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

Основна ідея анімаційних зображень: якщо швидко показувати одне зображення за іншим, створюється враження, що об'єкти на цих зображеннях рухаються.

Найпримітивніші анімаційні формати зберігають повні зображення, які послідовно, зазвичай у циклі, відображаються. Більш вдосконалені формати зберігають тільки одне зображення, але багато карт кольорів для нього. При послідовному завантаженні карт кольорів зображення змінюється й здається, що об'єкти на зображенні рухаються. Спочатку для зменшення обсягу відео-файлів кожне зображення ущільнювалося за допомогою базових алгоритмів ущільнення нерухомих зображень. Досконаліші анімаційні формати зберігають тільки різницю між двома сусідніми зображеннями (так називаними "фреймами" — frames — або кадрами) й модифікують тільки ті піксели, що дійсно змінюються при відображенні чергового фрейма. Для мультиплікаційно-подібних анімацій є звичайною частота 10-15 фреймів/секунду. Для відео-анімацій зазвичай потрібна частота 20 і більше фреймів/секунду для створення ілюзії плавного руху.

До анімаційних (відео-) форматів, зокрема, належать GIF (загалом, цей формат не призначений для створення мультиплікації) ANI, DAT, FLC, FLI, FLM, Intel Indeo, MJPEG, MVE, BIC, SMR, TDDD, TTDDD.

Як окрему групу слід виділити формати для зберігання тривимірних даних, назвемо їх ЗD-форматами. 3D-формати зберігають описи форми, кольорів і т.п. тривимірних моделей уявних чи реальних об'єктів. Зазвичай тривимірні моделі створюються з багатокутників і гладких поверхонь, для яких описані такі характеристики, як кольори, текстури, відбиття тощо. Моделі поміщені в сцени з джерелами світла, камерами тощо. Програми моделювання й анімації, такі, наприклад, як Lightwave та 3D Studio Max, використовують ці дані для створення растрових зображень або фреймів, послідовність котрих можна використати для створення анімацій.

Як подальший розвиток анімаційних форматів можна розглядати формати мультимедіа. Вони розроблені для того, щоб зберігати в одному файлі дані різних типів (графіку, звук, відеоінформацію тощо). Формати IFF, RIFF (та його спеціальний випадок — формат AVI), QuickTime (QTIF, в операційній системі Windows — формат MOV), MPEG (а саме MPEG-1, MPEG-2, MPEG-4, MPEG-21) й інші належать до форматів мультимедіа. Формати графічних файлів можна також розділити на такі класи:

• ті, що зберігають зображення в растровому вигляді (BMP, DIB, RLE, TIFF, PCX, PSD, JPEG, PNG, LWF, TGA, MrSID, Scitex CT (.sct), RAW, IFF, CAM, CLP, CPT, CUR, DCM, DCX, IMG, FIF, KDC, LBM, KDC, PBM, PIC, PGM, RAS, RBS, PCD, PIC, PIX, SUN, STING, XPM і ін.);

• ті, що зберігають зображення у векторному вигляді (AutoCAD DXF, Microsoft SYLK, Shockwave Flash і ін.);

• ті, що можуть сполучати растрові й векторні представлення (EPS, РІСТ, CDR, АІ, FH7 й ін.);

• метафайли (CGM, PDF, EMF, WMF, графіка Excel, файли Adobe Table Editor, PLT- та HPGL-графіка, OLE-об'єкти, DXF-графіка, рисунки Lotus РІС та інші), котрі, крім інформації про растрові та/або векторні зображення, містять також інформацію про команди візуалізації.


3. Використовуючи команди надбудови над OpenGl створити тривимірну фігуру та забезпечити її поворот при натисненні на кнопку пробіл

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

OpenGL, Menus;

type

TfrmGL = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormPaint(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure FormResize(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

private

DC : HDC; //контекст пристрою

hrc: HGLRC; //контекст відображення

ry : GLfloat; //зміна координати по У

tx : GLfloat; //зміна координати по Х

end;

var

frmGL: TfrmGL;

mode : (POINT, LINE, FILL) = FILL; //режими відображення обєкта

mx,my:byte; //коефіцієнти збільшення/зменшення

implementation

uses DGLUT;

{$R *.DFM}

procedure TfrmGL.FormPaint(Sender: TObject);

begin

glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очищення буферу кольору

glPushMatrix; //заповнюємо систему координат

glScalef (my/mx, my/mx, my/mx); //виконуємо маштабування

glRotatef (ry, 0.0, 1.0, 0.0); //виконуємо потовот

glTranslatef (tx, 0.0, 0.0); //виконуємо перенесення

case mode of //вибираємо режим відображення

POINT : glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);

LINE : glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);

FILL : glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);

end;

glutSolidSphere (1.5, 20, 20); //будуємо сферу

glScalef (mx/my, mx/my, mx/my); //повертаємо систему в початкове полож

glPopMatrix; //повертаємо систему в попереднє положення

SwapBuffers(DC); //відображуємо на екрані

end;

procedure SetDCPixelFormat (hdc : HDC);

var

pfd : TPixelFormatDescriptor;

nPixelFormat : Integer;

begin

FillChar (pfd, SizeOf (pfd), 0);

pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

nPixelFormat := ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

procedure TfrmGL.FormCreate(Sender: TObject);

begin

DC := GetDC (Handle);

SetDCPixelFormat(DC);

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона

glLineWidth (1.5);

glEnable (GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_DEPTH_TEST);

glEnable (GL_COLOR_MATERIAL);

glColor3f (1.0, 0.0, 0.0);

ry := 0.0;

tx := 0.0;

mx:=10;

my:=10;

end;

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

wglMakeCurrent(0, 0);

wglDeleteContext(hrc);

ReleaseDC (Handle, DC);

DeleteDC (DC);

end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

If Key = VK_ESCAPE then Close;

If Key = VK_LEFT then begin

ry := ry + 2.0;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_RIGHT then begin

ry := ry - 2.0;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_UP then begin

tx := tx - 0.1;

InvalidateRect(Handle, nil, False);

end;

If Key = VK_DOWN then begin

tx := tx + 0.1;

InvalidateRect(Handle, nil, False);

end;

If Key = 49 then begin

mode := POINT;

InvalidateRect(Handle, nil, False);

end;

If Key = 50 then begin

mode := LINE;

InvalidateRect(Handle, nil, False);

end;

If Key = 51 then begin

mode := FILL;

InvalidateRect(Handle, nil, False);

end;

end;

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

glFrustum (-1, 1, -1, 1, 2, 9);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

// этот фрагмент нужен для придания трёхмерности

glTranslatef(0.0, 0.0, -5.0); // перенос объекта - ось Z

glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X

glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y

InvalidateRect(Handle, nil, False);

end;

4. Для попереднього практичного завдання вашого варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“

Потім для точного виконання завдання виконала слідуючий алгоритм дій при цьому використала згідно варіанту клавіші «+» та «-», що по умові завдання виконують наближення та відділення фігури на фоні:

procedure TfrmGL.FormKeyPress(Sender: TObject; var Key: Char);

begin

if key = '-' then mx:=mx+1;

if key = '+' then mx:=mx-1;

InvalidateRect(Handle, nil, False);

end;

end.


Список використаної літератури

1. С.В.Глушаков, Г.А.Крабе. Компютерная графика, Харьков 2002

2. Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004.

3. OpenGl, технология ставшая символов, Учебник в примерах.

4. Конспект лекцій.

5. Мережа Інтернет.