3D-формати і їх застосування
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівський політехнічний коледж
КОНТРОЛЬНА РОБОТА
з предмета "Комп'ютерна графіка”
Виконав:студент групи ПЗС-504
ШПАК Р.В.
Перевірив викладач:КОЗІК В.Ю.
м. Бердичів
2008 р.
1. 3D-формати
Тут ми дамо стислу характеристику деяких популярних форматів, які містять у собі опис тривимірних об'єктів.
Формат VRML
VRML (мова моделювання віртуальної реальності — Virtual Reality Modeling Language) — графічний формат, що базується на підмножині Open Inventor фірми Silicon Graphics. Він призначений для опису тривимірних зображень й обміну ними в мережі World Wide Web.
Мова VRML, що була розроблена Gavin Bell, Rick Carey, Mark Pesce і Tony Parisi, стала першою мовою тривимірного моделювання для Web. У 1995 була створена група VAG (VRML Authoring Group) і з'явилася остаточна редакція специфікації VRML 1.0. У 1997 році технологію підтримали у своїх браузерах як Microsoft, так і Netscape. ISO схвалила другу версію специфікації як міжнародний стандарт VRML 97 (або ISO/IEC 14772-1). Саме цю специфікацію розглянемо дещо докладніше.
VRML-файл має розширення WRL. Він використовує формат ASCII й являє собою звичайний текстовий файл із списком об'єктів, які названі вузлами (nodes). До вузлів VRML 2.0, зокрема, відносяться ЗD-геометрія, властивості світла, що створюється за допомогою VRML, файли зображень формату JPEG, відеофайли формату MPEG, звукові файли формату MIDI, текстові документи формату HTML.
Перелік вузлів VRML 2.0 наведено у таблиці 6.23.
Вузли можуть входити в ієрархічні структури, у яких одні вузли успадковують характеристики інших вузлів, розташованих на більш високих рівнях ієрархії.
VRML 2.0 дозволяє створювати й реєструвати нові об'єкти на основі існуючого стандарту мови.
Вузли складаються з типів (nodetype), за котрими у фігурних дужках ідуть поля:
Поля можуть бути двох різних типів:
Значення поля field є типу private, тобто не можуть бути змінені іншими вузлами. У свою чергу, значення поля exposedField є типу public, тобто можуть бути змінені іншими вузлами.
Якщо поля вузлів не вказані, їм присвоюються значення за умовчанням. Наприклад, Cube {} задає куб зі сторонами в одну одиницю масштабу, в поточному місці розташування курсору, із гранями поточного кольору.
Кожне поле має наступні параметри:
• тип;
• ім'я;
• значення за мовчазною згодою.
Вузол може одержувати повідомлення типу eventIn, що починаються із суфікса set_ (наприклад, set_color, set_position і т.д.). Дані повідомлення змінюють поля вузла, й, відповідно, сам вузол. У свою чергу, вузол може посилати повідомлення типу eventOut, що закінчуються префіксом _changed (наприклад, color_ohanged, position_changed і т.д.). Дані повідомлення показують, що в самому вузлі щось змінилося.
Поля типу exposedField можуть бути використані для більш короткої вказівки на те, що поле посилає й одержує повідомлення типу eventln і eventOut. Для прикладу опис типа:
еквівалентний опису типа:
тобто, отримано повідомлення set_fоо типу eventln, отже автоматично встановлюється значення поля foo, і генерується повідомлення foo_change типy eventOut.
Зв'язок між вузлом, що генерує повідомлення типу eventln, і вузлом, що отримує повідомлення типу eventOut, отримала назву route (маршрут).
VRML використовує декартову тривимірну систему координат. За умовчанням об'єкти проецируються на двовимірний пристрій відображення у напрямку позитивної осі Z.
Сцени можуть містити довільне число локальних систем координат, визначені полями "transformation" вузлів "Transform" та "Billboard".
Концептуально, VRML також має систему світових координат. Різні локальні координатні перетворення відображаються у системі світових координат відповідно до ієрархії у графі сцени.
VRML 2.0 має наступні елементи й механізми:
• елементи для представлення інформації про 2D- і ЗD-примітиви;
• елементи для визначення характеристик цих примітивів;
• елементи для перегляду й моделювання 2D- і ЗD-інформації;
• механізм для збереження й передачі мережами 2D- і ЗD-даних;
• механізм для включення даних з інших метафайлів;
• механізм для визначення нових типів і форм інформації.
Структура VRML-файлу така:
• обов'язковий рядок-заголовок #VRML V2.0 utf8. (Символ "#" починає коментар. Коментар продовжується до кінця поточного рядка. Ідентифікатор utf8 вказує, що в VRML використовуватимуться символи кодування UTF-8 стандарту ISO 10646. Рядок закінчується символами newline ASCII або переводу каретки);
• будь-яка кількість прототипів (визначення нових класів об'єктів);
• будь-яка кількість вузлів;
• будь-яка кількість команд ROUTE (визначення зв'язку чи маршруту події — тобто хто що і кому повинен передавати).
Використання прототипів — це механізм, що дозволяє розширити набір типів вузлів у файлі VRML. Він дає можливість формувати пакет і параметризувати геометрію, атрибути, поводження нових об'єктів.
Визначення прототипу складається з наступного.
• Ключове слово PROTO.
• Ім'я типу нового вузла.
• Оголошення прототипу, що містить:
• список eventIns і eventOuts типу public;
• список exposedFields типу public і полів зі значеннями за умовчанням.
• Визначення прототипу, що містить:
• список одного чи більше вузлів;
• нуль чи більшу кількість маршрутів і прототипів.
Команди ROUTE у кінці файлу VRML вказують шляхи для інформації, яка передається між різними вузлами й частинами вузлів. Ці команди необхідні для реалізації інтерактивності та складного поводження, яке можливе в світі VRML 2.0 (The Virtual Reality Modeling Language Specification. Version 2.0, ISO/IEC CD 14772 [108]).
Наведемо приклад файлу VRML. VRML-світ із червоною кулею та кубом [107]:
Основні ідеї мови VRML активно використовуються в сучасних засобах візуалізації тривимірних сцен.
Формат 3DS
Це один із найпоширеніших форматів для ЗD-графіки. Файли формату 3DS були стандартними файлами програми 3D Studio, ще коли вона працювала під DOS. У 3D Studio MAX з'явився інший формат збереження — МАХ, але для розробки ігор цей новий формат виявився незручним. Натомість формат 3DS виявився придатним для цієї мети: крім самих тривимірних моделей (які являють собою каркасні сітки), він зберігає їхнє положення у світових координатах, координати текстур, кольори вершин, ключові кадри анімації, дані про властивості матеріалів і навіть атмосферні ефекти. Це практично готовий формат для збереження моделей і цілих карт (тільки скриптові команди доводиться зберігати окремо). Підкреслимо, що при збереженні ЗDS-файлів можна вказати, щоб координати текстур зберігалися разом із моделлю. Після цієї операції накладення текстури відбувається якісніше. Формат 3DS є зручним і практичним для будь-яких видів ігрових моделей. Він широко використовується для обміну даними між системами тривимірного моделювання.
Формати MDL, MD2 і MD3
Ці формати призначені для збереження анімаційних моделей, особливо анімації людей. Усі три формати відкриті, ними може скористатися будь-який бажаючий. У них зберігаються моделі й дані про немов би "кістякову" анімацію. Анімації моделей зберігаються в цих форматах у тривимірних кадрах, причому кожному кадру відповідає своя повноцінна модель. Розмір файлів при цьому зростає пропорційно кількості кадрів анімації й може виявитися завеликим для серйозних ігор, втім, формати MDL, MD2 і MD3 можна досить сильно ущільнити.
Формат SMD
У файлах формату SMD зберігається "чиста" кістякова анімація. Це приводить до зменшення розмірів файлів і поліпшення якості анімації. Система збереження файлів має деякі особливості. По-перше, необхідний ключовий SMD-файл. У ньому зберігається сама модель без анімації. Його необхідно завантажувати в першу чергу. По-друге, необхідні анімаційні дані про модель, які зберігаються в інших файлах (один файл на одну анімацію). Якщо необхідна висока якість анімації, використовують цей формат.
Формат X
Формат X— це "рідний" формат DirectX для тривимірних моделей. Він використовувався тільки Direct3D:RM, але й Direct3D:IM можна було "примусити" працювати з цим форматом.
Direct3D:Retained Mode (Direct3D:RM) — це набір АРІ, створений для легшого програмування тривимірної графіки (порівняно з більш низькорівневим Direct3D:Immediate Mode (Direct3D:IM), на якому заснований сам Direct3D:RM). Direct3D:RM має набір інструментів для завантаження й маніпулювання форматом тривимірних моделей X. Раніше Direct3D був пов'язаний з DirectDraw, але з початком розробки Direct 8 відділ Microsoft прийняв рішення назавжди зупинити розвиток цього компонента, a Direct3D зробити цілком самодостатнім засобом виводу графіки в Direct. Тепер він називається DirectXGraphics. Утім, у складі SDK дотепер є файл ddraw.h, щоб користувачі мали можливість і далі працювати з DirectDraw.
Формат X — структурно- та контекстнонезалежний формат. Він керується шаблоном і може використовуватися будь-якою клієнтською програмою. За його допомогою описуються геометричні дані, ієрархія фреймів, анімація.
При створенні файлів як у форматі 3DS, так і у форматі X, вводиться тільки ім'я текстури. Самі текстури (переважно у форматі BMP) зберігають у вигляді окремих файлів на диску. Зручність формату X полягає, зокрема, в тім, що за допомогою невеликої утиліти 3dsconv, ви можете конвертувати моделі з популярного формату 3DS у формат X. Ви можете малювати свої моделі в Kinetix 3D Studio MAX, експортувати їх у формат 3DS і одержувати моделі у форматі X.
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.
Список використаної літератури
С.В.Глушаков, Г.А.Крабе. Компютерная графика, Харьков 2002
Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004.
OpenGl, технология ставшая символов, Учебник в примерах.
Конспект лекцій.
Мережа Інтернет.