POCETNA STRANA

Seminarski i Diplomski Rad
 

SEMINARSKI RAD IZ MULTIMEDIJE

 

GENERISANJE 3D STUDIO MAX MODELA U DIRECT3D-U

ZADATAK:

Potrebno je napraviti aplikaciju koja će koristeći Direct3D API učitavati modele koji su nacrtani u 3D Studio Max-u. Odlučili smo se da konkretno napravimo aplikaciju koja će izvršavati simulaciju leta kosog hitca. Scena koju smo zamislili sastoji se sljedećih objekata: topa koji ispaljuje projektile, projektila koji lete po putanji kosog hitca na osnovu parametara koje zadaje korisnik ( početna brzina i ugao), tla na kojem se nalaze objekti, i jedne trđave koja treba da dočara scenu. Svi objekti jednostavnosi radi neće imati realističan izgled jer je modelovanje ovakvih objekata izuzetno komplikovano. Korisniku je potrebno omogućiti da se kreće kroz scenu u svim pravcima, te da zumira i rotira pogled. Takođe korisniku treba omogućiti da unosi sljedeće parametre simulacije: početna brzina i ugao ispaljivanja projektila, brzinu animacije, i gravitacionu konstantu, i realizovati ispisivanje ovih parametara na ekranu. Simulaciju leta više projektila takođe je potrebno ralizovati. U aplikaciji neće biti implementiran skoro nikakav vid detekcije kolizije objekata.

ALATI ZA IZRADU

Za izradu aplikacije odabrali smo programski jezik C++ jer je brzine izvršavanja radi najpogodniji za izradu ovakvih aplikacije. Verzija C++ koju koristimo je Microsoft Visual C++ 6.0. Takođe pisanje Direct3D aplikacija nije moguće bez DirectX SDK alata. Kako sam naziv seminarskog rada govori za modelovanje objekata u sceni koristićemo program 3D Studio Max verziju 3 radi ograničenja u hardveru sa kojim raspolažemo. Uglavnom ćemo se pridržavati objektno orijentisanog pristupa izradi mada se nećemo pridržavati svih principa objektno orijentisane paradigme.

ANALIZA PROBLEMA

Uočimo sljedeće entitete top, projektil, tlo. Svaki objekat u sceni pored ima odgovarajuću geometriju i teksturu, x,y i z koordinate položaja i orijentaciju. Top ispaljuje projektile koji dalje lete po putanji definisanoj sljedećim formulama.

x,y i z koordinate položaja
x = v0 * t * cos(α)
y = v0 * t * sin(α) – (½) * g * t2

Direct3D aplikacije koriste koordinatni sistem lijeve orijentacije, pa ćemo se istim i mi koristiti.

Očigledno cijev topa mora da mijenja orijentaciju zavisno od zadanog ugla pod kojim se projektil ispaljuje. Početne koordinate projektila koji se ispaljuje takođe zavise od od ovog ugla i jednake su

Pocetne koordinate projektila

x0 = l * cos(α)
y0 = l * sin(α)

Projektili lete sve dok ne padnu na tlo kada se i zaustavljaju.

DIZAJN

Direct3D i Strukutra Direct3D aplikacija

Kako je svima poznato 3D grafika je procesno izuzetno zahtjevna zbog čega računari koji je koriste obavezno moraju da sadrže i 3D grafičku kartu. 3D grafička karta je uređaj koji je specijalizovan za obradu 3D grafike.

Direct3D API ( Aplication Programing Interface ) je progamerski interfjes za razvijanje aplikacija koje koriste mogućnosti 3D grafičke karte. Direct3D je nezavisan od konkretne impelmentacije grafičkog adaptera putem Direct3D HAL-a koji komunicira sa adapterom preko drajvera adaptera.

Direct3D API

Direct3D aplikacije su windows aplikacije, pa je za njihovu izradu potrebno elementarno znanje o programiranju Windows aplikacija u C-u koristeći Win32 API. Struktura Windows aplikacija u C –u otprilike izgleda ovako

#include <windows.h>
.
.
MessageHandler(...)
{
.
.
}
.
.
WinMain(...)
{
// Popunjavanje WNDCLASS strukture koja opisuje prozor koji treba kreirati
.
//Registriranje gore navedene WNDCLASS strukture koristeći //RegisterClass(*WNDCLASS ) funkciju
// Kreiranje prozora koristeći CreateWindow(....) funkciju

MSG msg;
while(1)
{
if( PeekMessage( &msg,..) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// Ovo je main message loop petlja koja obrađuje poruke koje OS šalje aplikaciji. Iako se // to eksplicitno ne vidi poziva se i funkcija MessageHandler koju korisnik definiše i
// prosljeđuje pokazivač na ovu funkciju pri popunjavanju WNDCLASS strukture, a čija // je jedina funkcija da programeru omogući da realizuje rakcije programa na
// odgovarajuće poruke OS-a.

}

Da bi se koristio Direct3D API potrebno je uključiti i biblioteku <d3d9.h>. Unutar WinMain funkcije poslije kreacije prozora i prije glavne petlje potrebno je inicjalizovati DIRECT3DDEVICE objekat. Ovaj objekat reprezentuje Direct3D uređaj koji aplikacija koristi. Opisivanje DIRECT3DDEVICE objeka u detalje prevazilazi okvire ovog seminarskog rada, ukratko pomoću ovog objekta aplikacija se povezuje sa grafičkim adapterom i definiše način na koji se on koristi to jest koje negove funkcionalnosti koristi. Takođe se koristi i za kreiranje svjetala, magle i raznih efekata, za iscrtavanje scene na ekranu, te mnoge druge funkcije.

Inicjalizaciju DIRECT3DDEVICE objekta izvršava DIRECT3D objekat, kojem je ovo i jedina funkcija, pozvimo metode CreateDevice. Jedan od arumenata ove medote je i pokazivač na D3DPRESENT_PARAMETERS strukturu koja opisuje prezentacione paramete, koju je potrebno popuniti. Tačan opis ove metode je dat u source kodu u vidu komentara. Jednom kreiren DIRECT3DDEVICE objekat koristi se za iscrtavanje scene na ekranu. Scena se iscrtava u vidu niza slika (frejmova). Za svaki frejm potrebno je iscrtati sve objekte u sceni. Iscrtavanje i update-ovanje frejmova vrši se unutar glavne petlje programa. Aplikacije imaju tendenciju da iscrtaju što veći broj frejmova u sekundi. Proces iscrtavanja frejma se naziva rendering .

while(1)
{
if( PeekMessage( &msg,..) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
g_pDevice->Clear(...);
g_pDevice->BeginScene();

            // Ovdje se nalazi kod koji treba da iscrta scenu

g_pDevice->EndScene();
}
}

U D3D-u geometrija objekata u sceni definisana je pomoću konačnog broja trouglova. Svaki trougao određen je sa 3 tačke (eng. vertex – u, daljem tekstu ćemo koristit ovaj izraz) to jest jednim trodimenzionalnim vektorom. Pored xyz koordinata koje vertex-i u D3D- čuvaju i informacije o materijalu i koordinatama tekstura, te još neke informacije o površinini koju definiše. Materijali su parametri koji definišu način na koji površina reflektuje svjetlost, dok su teksture bitmape koje daju ralističan izgled površini. Sve koordinate vertex-a modela date su u odnosu na vezani koordinatni sistem modela. Mainpulacija ovim vektorima vrši se pomoću matrica transformacije ( transormation matrix ). To su matrice dimenzija 4x4. Osnovne matrice transoformacije su matrice rotacije oko x, z i y, matrice translacije i matrice skaliranja. Množenje ovih matrica daje kumulativan rezultat. Naprimjer M1*M2 predstavlja transformaciju M1 koju slijedi M2 transformacija. Ove matrice detaljno su objašnjene u DirectX SDK dokumnetaciji. Dio D3D-a koji izvršava procesiranje vertex-a naziva se transformation engine, i ima za zadatak da odredi položaje modela, kamere, izvrši projekcijsku transformaciju tačaka koja daje osjećaj dubine u sceni, te izrši izračunavanja vezana sa svjetla.

World transformacije ima zadatak da definiše položaj vertex-a u odnosu na referentni koordinatni sistem. View transformacija transformiše sve koordinate vertex-a u sceni tako da one budu relativne u odnosu na kameru.

Podaci o vertex-ima u Direct3D čuvaju se u Vertex Buffer-ima, koje mi nismo koristi. Ono što smo koristi su .x fajlovi koji omogućavaju da se modeli (eng. meshes) modelovani u nekim od programa za 3D modelovanje učitaju u D3D aplikaciji i koriste na ralativno jednostavan način. Teksture koje modeli koriste čuvaju se u posebnim fajlovima (.jpg, .bmp ...) tj. ne nalaze se u .x fajlu.
Učitavanje modela vrši se pomoću funkcije D3DXLoadMeshFromX(...), koja uzima više parametara od čega je jedan i pokazivač na ID3DXMesh objekat , koji reprezentuje model. Teksture se čuvaju u objektima klase DIRECT3DTEXTURE, a materijali u D3DMATERIAL9 objektima. Teksture se učitavaju pomoću funkcije D3DXCreateTextureFromFile(...).
Za korišćenje D3DXLoadMeshFromX, ID3DXMesh i D3DXCreateTextureFromFile funkcija i objekta potrebno je uključiti i biblioteku <d3dx9.h>.
Za više informacija pogledati DirectX SDK dokumentaciju.

Struktura projekta

Visual C++ projekat koji odgovara našoj aplikaciji sadrži KosiHitac.cpp datoteku u kojoj se nalazi WinMain funkcija kao početna tačka izvršavanja. U istoj datoteci nalazi se i definicja MessageHandler funkcije kao i definicija render funkcije u kojoj se pozivaju metode koje imaju zadatak da iscrtaju scenu. Tu je i funkcija CleanUp koja prije izlaska iz programa uništava objekte koji su kreirani u toku izvršavanja. U projektu su kreirane i sljedeće klase:

  1. Interfejs – klasa koja definiše korisnički interfejs
  2. Kamera – klasa koja definiše kameru i posjeduje metode za manipulaciju kamerom
  3. Kotrole – klasa koja omogućava korisniku da pomoću tastature upravlja kamerom
  4. Model – klasa koja reprezentuju model u sceni
  5. Tekst – klasa za manipulaciju tekstom na površini ekrana
  6. Top – predstavlja top
  7. Vrijeme – klasa koja pored toga što služi za izračunavanje vremena koje protekne izneđu 3 frejma služi i za izračunavanje broja iscrtanih frejmova u sekundi( fps )
  8. Projektil ( struktura ) – struktura koja reprezenuje projektil koji top ispaljuje

Zaglavlja svih klasa odvojena su u header-e koji se nalaze u include folderu, dok su .cpp fajlovi smješteni u source folder.
Takođe u projektu se nalaze i fajlovi funkcije.h i funkcije.cpp koji u sebi sadrže zaglavlja i tijela nekih pomoćnih funkcija.
Tačan opis svih članova klasa nalzi se u pomenutim fajlovima u vidu kometara.

Unutar KosiHitac.cpp fajla u vidu globalnih varijabli nalaze se pokazivači na sve objekte koje aplikacija treba da inicijalizuje i koristi. Konstruktori ovih objekata nalaze se u WinMain funkciji izeđu CreateWindow() funkcije i glavne petlje programa. Svi klase posjeduju update() metode koje se pozivaju unutar glavne petlje i definišu kretanja i akcije. Update metoda klase Vrijeme vraća kao povratnu vrijednost podatak o vremenu koje je proteklo između 2 frejma, dok istoimene metode drugih klasa uzimaju kao argument ovu vrijenost tako da su kretanja svih objekata unutar scene vremensi zavisna.
Sve klase koje imaju i geometrijsku dimenziju takođe posjeduju i metodu iscrtaj() koja iscrtava objekat. Pozivi ovih metoda nalaze se unutar render funkcije koja se poziva za svaki frejm.

Unutar funkcije.cpp fajla nalazi se tijelo funkcije inicjalizacija(..) koja uzima 2 argumenta i ima za cilj da inicijalizuje DIRECT3DDEVICE objekat. Prvi argumet je pokazivač na pokazivač na DIRECT3D objekat, a drugi pokazivač na pokazivač na DIRECT3DDEVICE objekat. Nakon izvršavanja ove metode dobijamo pokazivač na inicijalizovan DIRECT3DDEVICE objekat. Za više detalja pogledati komentare u navedenom fajlu.

MODELOVANJE OBJEKATA

Modelovanje tla

Tlo ćemo modelirati po principu izohipsi (kontura koje čine tačke iste nadmorske visine). Potrebno je u Top viewportu nacrtati izvjestan broj kontura. To se radi tako što se u create tabu u klikne na shapes ikonu a zatim na line dugme nakon čega se iscrtaju konture. Konture je potrebno nakon toga razmjestiti duž z-ose tako da z-koordinate odgovaraju nadmorskim visinama kontura. Onda je potrebno selektovati sve konture i na create tabu unutar sekcije geometry odabere u padajućoj listi compound objects, a nakon toga klikne se na dugme terain. Dobijenom objektu potrebno je dodijeliti materijale i teksture. To se radi pomoću material editor prozora u kojem se kreira novi materijal tipa multi/subobject gdje se postavi broj materijala na tri. Prvi materijal će reprezentovati zelenu površinu koja se nalazi na nižim nadmorskim visinama, drugi stijene na srednjim visinama i treći snijeg na vrhovima. Prvom materijalu potrebno je dodijelitit teksturu kao bitmapu iz fajla green1.jpg. Drugom materijalu takođe bitmapu grydirt1.jpg, a trećem postaviti defuse bijelu boju. Nakon toga potrebno je dodijleti odgovarajuće material ID brojeve poligonima koji pripadaju istim regionima. To se radi pomoću mesh select modifiktora unutar modify panela. Poligonima iz niže nadmorske visine dodjeli se Material ID 1, srednjim 2 i vrhovima 3. Nakon toga se kreirani materijal dodjeli objeku.
Modelovanje tla

Modelovanje postolja topa

Top ćemo sastaviti iz 3 cijeline.
Modelovanje postolja topa

Podloga se dobije kao jedan box objekat, dok se bočne strane takođe dobiju iz box objekta čiju geomeriju je potrebno promjeniti. To se radi tako što se objekat konvertuje u editabe mesh a nakon toga se selektuju vertex-i koji se pomaknu tako da se dobije oblik sa slike. Nakon toga potrebno je nacrtati 4 cilindra. Svi objekti se spoje u jednan boolean unin objekat( Crate- Geometry – Compound Objects – Boolean). Nakon toga na objekat se primjeni UVW modifikator tipa Box  koji obezbeduje da se tekstura pravilno dodjeli površinama postolja. Nakon toga kerira se materijal tip bitmap iz fajla Cedfence.jpg i dodjeli postolju.

Modelovanje cijevi

Modelovanje cijevi

Cijev se kreira iz cilindra koji ima 5 height segmenata. Taj se cilindar konverruje u editable mesh. Nakon toga potrebno se vertex-e tog mesha podesiti tako da se dobije oblik sa slike. Nakon toga potrebno je kreirati cilindar manjeg radijusa i visine postaviti ga u centar prethodnog cilindra, a zatim ta dva objekta spojiti u jedan boolean subtraction objekat tako da se dobije šuplja cijev.

Sve navedeno objekte potrebno je zasebno eksportovati u .3DS format a nakon toga pomoću conv3ds.exe programa konvertovati sve .3ds fajlove u .X format koji je prepoznatljiv Direct3D-u.

PROČITAJ / PREUZMI I DRUGE SEMINARSKE RADOVE IZ OBLASTI:
ASTRONOMIJA | BANKARSTVO I MONETARNA EKONOMIJA | BIOLOGIJA | EKONOMIJA | ELEKTRONIKA | ELEKTRONSKO POSLOVANJE | EKOLOGIJA - EKOLOŠKI MENADŽMENT | FILOZOFIJA | FINANSIJE |  FINANSIJSKA TRŽIŠTA I BERZANSKI    MENADŽMENT | FINANSIJSKI MENADŽMENT | FISKALNA EKONOMIJA | FIZIKA | GEOGRAFIJA | INFORMACIONI SISTEMI | INFORMATIKA | INTERNET - WEB | ISTORIJA | JAVNE FINANSIJE | KOMUNIKOLOGIJA - KOMUNIKACIJE | KRIMINOLOGIJA | KNJIŽEVNOST I JEZIK | LOGISTIKA | LOGOPEDIJA | LJUDSKI RESURSI | MAKROEKONOMIJA | MARKETING | MATEMATIKA | MEDICINA | MEDJUNARODNA EKONOMIJA | MENADŽMENT | MIKROEKONOMIJA | MULTIMEDIJA | ODNOSI SA JAVNOŠĆU |  OPERATIVNI I STRATEGIJSKI    MENADŽMENT | OSNOVI MENADŽMENTA | OSNOVI EKONOMIJE | OSIGURANJE | PARAPSIHOLOGIJA | PEDAGOGIJA | POLITIČKE NAUKE | POLJOPRIVREDA | POSLOVNA EKONOMIJA | POSLOVNA ETIKA | PRAVO | PRAVO EVROPSKE UNIJE | PREDUZETNIŠTVO | PRIVREDNI SISTEMI | PROIZVODNI I USLUŽNI MENADŽMENT | PROGRAMIRANJE | PSIHOLOGIJA | PSIHIJATRIJA / PSIHOPATOLOGIJA | RAČUNOVODSTVO | RELIGIJA | SOCIOLOGIJA |  SPOLJNOTRGOVINSKO I DEVIZNO POSLOVANJE | SPORT - MENADŽMENT U SPORTU | STATISTIKA | TEHNOLOŠKI SISTEMI | TURIZMOLOGIJA | UPRAVLJANJE KVALITETOM | UPRAVLJANJE PROMENAMA | VETERINA | ŽURNALISTIKA - NOVINARSTVO