Predsatvitev 3D geometrijskih modelov

Kazalo

Definicija naloge
Baza podatkov
Struktura vhodne datoteke
Predstavitev modelov
Princip prikazovanja žičnega modela
Izris žičnega modela
Geometrijske transformacije
Opis delovanja programa
Uporabniški vmesnik
Delovanje programa
Zaključek

Definicija naloge

Izdelati je potrebno računalniški program, ki iz datoteke prečita podatke o geometriji 3D modelov, modele prikaže na zaslonu, jih na uporabnikovo zahtevo predstavlja v poljuben položaj, povečuje oziroma pomanjšuje in omogoča perspektivni pogled. Pri programiranju izrisa uporabite nabor ukazov, ki jih predpisuje standard GKS ali PHIGS.

Baza podatkov

Pri reševanju te naloge sem predvidel, da mora biti v pomnilniku hkrati več modelov. Zato sem si izdelal svojo podatkovno strukturo, ki omogoča enostavnejšo uporabo pri delu z večjimi modeli. V programu je predvideno hkratno predstavljanje do 10 modelov, ki so med seboj popolnoma neodvisni. Na enostaven način se da omejitev desetih modelov razširiti na več. Vsak model lahko vsebuje poljubno število točk, robov in ploskev, vsaka ploskev pa ima lahko največ 10 robov. Obsežnost modela je omejena le s količino pomnilnika, ki je na razpolago. Hierarhija modela je sledeča:
obj(10)	(OBJEKT - moj tip)
	poln		(LOGICAL - če je model v uporabi)
	sprememba	(LOGICAL - če se bo na njem izvedla naslednja operacija)
	izrisi		(LOGICAL - če bo izrisan na zaslon)
	st_tock		(INTEGER - število točk)
	st_robov	(INTEGER - število robov)
	st_ploskev	(INTEGER - število ploskev)
	v (POINTER)	(TOCKA - moj tip točke (spremenljive obsežnosti))
		x, y, z	(REAL - koordinata točke)
	e (POINTER)	(ROB - moj tip robu (spremenljive obsežnosti))
		t1, t2	(INTEGER - št. obeh točk robu)
	pl (POINTER)	(PLOSKEV - moj tip ploskve (spremenljive obsežnosti))
		st_robov(INTEGER - število robov ploskve)
		rob(10)	(INTEGER - številka robu)
		tezisce	(V - točka težišča)
		normala	(V - normala na ploskev)
	komentar	(CHARACTER*80 - komentar modela)
V fortranu izgleda definicija baze tako:
TYPE tocka				!definicija točke
	SEQUENCE
	REAL x,y,z
END TYPE tocka

TYPE rob				!definicija robu
	SEQUENCE
	INTEGER t1,t2
END TYPE rob

TYPE ploskev				!definicija ploskve
	SEQUENCE
	INTEGER st_robov
	INTEGER rob(10)			!maksimalno 10 robov
	TYPE (tocka) :: tezisce
	TYPE (tocka) :: normala
END TYPE ploskev

TYPE objekt				!definicija objekta
	SEQUENCE
	LOGICAL poln, sprememba, izrisi
	INTEGER st_tock, st_robov, st_ploskev
	TYPE (tocka),POINTER :: v(:)
	TYPE (rob),POINTER :: e(:)
	TYPE (ploskev),POINTER :: pl(:)
	CHARACTER*80 komentar
END TYPE objekt
Struktura podatkov je zasnovana tako, da ni omejitve pri številu točk, robov in ploskev modela, pri tem pa program porabi za model le toliko pomnilnika, kot ga potrebuje. Torej, velikost baze se samodejno spreminja.

Struktura vhodne datoteke

Vhodna datoteka mora vsebovati podatke o številu oglišč in njihovih koordinatah, število robov in njihovo definicijo ter število ploskev in njihovo definicijo. Tako enostavno bazo se navaja v datoteki v ASCII standardu.
Primer datoteke, ki popisuje tetraeder:
Tetraeder	- komentar modela (do 80 znakov)
4	- število točk
0. 0. 0.	- koordinata točke 1.
5. 0. 0.	- ...
2.5 4.330127 2.5
2.5 4.330127 -2.5
6	- število robov
1 3	- rob 1. (od točke 1. do 3.)
3 2	- ...
2 4
4 1
4 3
1 2
4	- število ploskev
4 1 5	- robovi, ki povezujejo 1. ploskev
3 5 2	- ...
6 2 1
6 4 3
V tako definirani bazi smo omejeni na ravninske modele brez sferičnih ploskev, cilindrov, izvrtin, zaokroženih robov ter podobno.

Predstavitev modelov

Modele lahko predstavimo na več načinov. Najenostavnejši je prikaz žičnega modela, pri katerem lahko prikažemo le robove modela, pri katerem ni informacij o stanju ploskev in volumna. Pri takem modelu ni mogoče skrivati nevidnih robov in ga ni mogoče senčiti.

Slika 1 Primer žičnega modela

Naslednji način prikaza je prikaz ploskovnih modelov. Tu smo omejeni le na prikaz ploskev, katere se lahko s grafičnimi procesorji senči in skriva nevidne robove. Pri takem načinu dobi uporabnik boljšo predstavo o geometriji modela. Na ploskve modela se lahko 'lepi' teksture, ki še izboljšajo predstavo o stanju modela. Ne moremo pa rezati modela, delati prerezov


Slika 2 Primer ploskovnega modela

Najbolj popoln pa je volumski prikaz modelov. Pri tem načinu modeliranja pa imamo vse informacije o volumnu modela. To so material, specifična masa, vse mehanske lastnosti, s katerimi lahko računamo napetostna stanja in podobno. Na takih modelih se lahko vršijo Boolove operacije s katerimi dosežemo združevanje in rezanje. Volumske modelirnike se uporablja predvsem za načrtovanje modelov, ki se jih kasneje izdela z računalniško krmiljenim obdelovalnim strojem.


Slika 3 Primer volumskega modela na katerem lahko izvajamo Boolove operacije

Moj program je narejen za prikaz žičnih modelov, ki so omejeni le z ravnimi ploskvami. Prikaz zaokrožitev robov, skrivanje robov ter senčenje ploskev zahteva veliko programerske spretnosti, s čimer pa se v okviru teh vaj ne bi ukvarjal.

Princip prikazovanja žičnega modela

|ični model prikazujemo na ekran tako, da izrisujemo posamezne robove modela. Vsak rob ima dve točki, vsaka točka pa ima tri koordinate. Iz robov so sestavljene ploskve, iz ploskev pa modeli. Za prikaz žičnega modela na ekran ne potrebujemo podatkov o ploskvah, ker izrisujemo le robove. V tem primeru nam definicija ploskev služi le za izračun težišč ploskev in normal na ploskve, ki nam daje orientiranost ploskve, iz katere lahko sklepamo, kje je model 'poln' ali 'prazen'.

Slika 4 Črtovje ploskve

Izračun težišča ploskve bom poenostavil in računal težišče črtovja, kar pa ni hkrati tudi težišče ploskve. Težišče črtovja se izračuna z enačbo:

pri čemer je Txe težišče robu v x smeri in l dolžina robu.

Analogno velja za y in z koordinato.

Za izračun normale je najprej potrebno izračunati orientiranost ploskve. Program preverja, če so robovi zvezno razporejeni, kar je pogoj, da lahko izračunamo orientiranost ploskve. Predpostavil sem, da ima ploskev pozitivno orientiranost, če si navedba robov sledi v nasprotnem smislu urinega kazalca. Tako bi pri navedbi robov '1 2 3 4' normala kazala v pozitivni smeri z osi, pri '4 3 2 1' pa v negativni smeri. Definicija ploskve '2 4 1 3' nima pomena in program javi napako.

Algoritem za iskanja normale vzame prva dva robova kot vektorja in izračuna vektorski produkt med njima.



Dobimo vektor, ki je pravokoten na oba vektorja in s tem smernico normale. Prave usmerjenosti pa še vedno ne kaže, ker ne vemo, ali robova oklepata ostri ali topi kot ploskve. Zato je potrebno izračunati vektorski produkt v vsakem oglišču ploskve, dobljene vektorje pa med seboj sešteti,


pri čemer je n število robov ploskve, vi pa točke ploskve.

Dobljeni vektor N nam daje pravo usmerjenost in neko dolžino. Normalni vektor pa ima dolžino 1, zato ta vektor delimo z njegovo dolžino.

Dobili smo normalo ploskve ki jo izrisujemo na težišču ploskve oz. težišču črtovja.

Izris žičnega modela

Pri izrisovanju žičnega modela na ekran smo omejeni le na dve koordinati, vtis tretje razsežnosti pa dobimo s perspektivnim pogledom. Z oddaljenostjo predmeta se njegove dimenzije navidezno manjšajo. Ta efekt je potrebno prikazati na zaslonu tako, se objekt v ospredju izriše večje, z globino pa se njegove dimenzije manjšajo.

Pred vsakim izrisom se morajo izračunati nove perspektivne koordinate, delovne pa ostanejo nespremenjene. Upoštevati je potrebno, da mora biti točka v neskončnosti vidna na sredini ekrana, zato moramo pred izračunom koordinat, ki se bodo izrisale na zaslon prilagoditi tako, da je zaslonsko koordinatno izhodišče na sredini zaslona.


Slika 4 Skica principa perspektive

maxy - maksimalna y koordinata zaslona
miny - minimalna y koordinata zaslona

Nove koordinate perspektive izračunamo s pomočjo podobnih trikotnikov:

rmax je maksimalna oddaljenost točke od računskega koordinatnega izhodišča. f je oddaljenost točke opazovanja od projekcijske ravnine (zaslona). Ta razdalja mora biti proporcionalna z velikostjo predmeta na ekranu oz. maksimalno oddaljenostjo točke od računskega koordinatnega izhodišča.

f0 - konstanta perspektivnega pogleda


Slika 5 fo=1,4; Slika 6 fo=0,3

Dobljene koordinate je pred izrisom potrebno prilagoditi nazaj na dejanske zaslonske koordinate:

Analogno velja za koordinate x.

Končne dobljene koordinate lahko nato izrišemo na ekran.


Slika 7 Primer ortogonalne paralelne projekcije


Slika 8 Primer centralne projekcije z enim bežiščem (perspektiva)

Geometrijske transformacije

Modele je potrebno na ekranu tudi poljubno obračati, translatorno premikati in pomanjševati ter povečevati. Te operacije izvajamo z geometrijskimi transformacijami. Princip geometrijskih transformacij je tak, da množimo vektor s transformacijsko matriko in dobimo nov vektor, ki predstavlja novo lokacijo točke. Za vsak tip geometrijske transformacije moramo nastaviti svojo transformacijsko matriko, ki je dimenzije 4×4. Vse transformacijske matrike bazirajo na enotski matriki, ki ji zamenjamo nekaj členov, glede na to, za katero transformacijo gre.

Za translacijo nastavimo sledečo matriko:


za skalacijo:

ter za rotacijo v vseh treh smereh:



Vektor, ki ga množimo z matrikami pa je četrte dimenzije in je sestavljen iz treh koordinat točke, četrti člen pa je 1:

Dobimo vektor četrte dimenzije, v katerem so prvi trije členi koordinate nove točke.

Opis delovanja programa

Uporabniški vmesnik

Komunikacija med uporabnikom in programom poteka preko sprožilnih tipk. Tipke od 1 do 6 so uporabljene za vrtenje vseh modelov okoli osi. Z njimi spreminjamo kot pogleda na modele. do premikajo točko pogleda levo, desno, gor in dol. Tipke 'X', 'Y', 'Z' rotirajo le izbrane (ali vse) modele okoli izbrane osi (x, y ali z). Ta rotacija je neodvisna od trenutnega pogleda na modele in izbrane modele obrne glede na prikazane osi na zaslonu. Tipka 'M' in 'S' premakne oz. skalira izbrane modele po koordinatnih oseh. Tudi ti dve možnosti transformirata po koordinatnih oseh ne glede na kot pogleda na modele. S tipko 'L' naložimo nov model v pomnilnik. Şe je naloženih že 10 objektov, nas na to program opozori. Tipka 'W' shrani vse modele iz pomnilnika v datoteko. Le-to datoteko lahko kasneje preberemo s tipko 'R', ki pred tem izbriše trenutni pomnilnik. Tipka 'H' skrije izbrane modele, ki jih pri ponovni aktivaciji iste sprožilne tipke lahko spet prikaže. Medtem, ko je bil model skrit, so se na njem vršile vse rotacije, ki se tičejo vrtenja pogleda. Preslednica prilagodi zaslonske koordinate na nove koordinate modelov, če je pri transformaciji kakšen del modela izpadel iz zaslona. '+' in '-' povečevanja oz. pomanjšujeta zaslona. Pri tem se ne vrši nobena geometrijska transformacija, temveč se le prilagajajo zaslonske koordinate (maxx, minx ter maxy in miny). Tipka 'K' sproži konfiguracijsko rutino, s katero nastavljamo parametre delovanja. 'P' vrne pogled v začetno stanje (točka pogleda 0,0,1), 'U' pa to razveljavi. Program se zaključi z '!'.

Delovanje programa

Program ima v pomnilniku le eno bazo za vse modele. Koordinate se pri obračanju pogleda stalno spreminjajo tako, da na ekran neposredno rišemo x in y komponente točk. Prav tako se skladno z njimi spreminjajo tudi koordinate koordinatnega izhodišča. Pravzaprav gre za vrtenje enega koordinatnega sistema v drugem. Vrtimo koordinatni sistem modelov v koordinatnem sitemu zaslona, ki je fiksen, pri tem pa se izhodišči obeh sistemov skladata.

Program je narejen tako, da se lahko modele premika poljubno po koordinatnem sistemu modelov tako, da ohranimo medsebojno relacijo med modeli. Ker pa imamo koordinate modelov v pomnilniku prirejene na zaslonske koordinate, nam transformacijske matrike transformirajo modele le po koordinatnih oseh zaslona. Zato je potrebno pred translatornim premikom, skalacijo ter rotacijo po glavnih oseh modelov (torej pred vsako transformacijo, ki se ne tiče vrtenja pogleda), najprej uskladiti oba koordinatna sistema med seboj. To naredi rutina PLAN, ki zavrti modele in koordinatne osi okoli vseh treh zaslonskih osi tako, da se osi obeh sistemov skladajo. Nato se izvrši želena transformacija. Po tem se točka pogleda vrne nazaj na začetno mesto tako, da se pogled zavrti v obratnem vrstnem redu za nasprotne kote, kot se je pri rutini PLAN. S tem dobimo občutek, da se je premaknil samo en model ali več (odvisno od tega, koliko jih je izbranih), ostali pa so ostali na istem mestu.

Pri branju novega modela se meje zaslona samodejno prilagodijo vsem modelom, ki so že v pomnilniku vključno z novim, tako da noben model ne izpade iz zaslona. Za to skrbi rutina INIT_WINDOW, ki išče najmanjše in največje koordinate in jih prilagodi razmerju stranic zaslona tako, da so si stranice modelov med seboj proporcionalne, modeli pa so na zaslonu centrirani.


Slika 9 Centriranje modela na zaslon

Rutina INIT_WINDOW najprej poišče minimalne in maksimalne koordinate modela, nato jih pomanjša oz. poveča za 10%, da model ne sega od roba do roba.

Sedaj imamo koordinate robov zaslona, ki niso nujno v pravem razmerju z širino in višino ekrana, zato jih je potrebno korigirati, tako da je
.

Sledi, da je
,
.

Glede na ta razmerja je potrebno spremeniti še maxx, minx ter maxy in miny.

Pri premikanju okna levo, desno, gor in dol se pred risanjem samo spremenijo koordinate okna izrisa in se na modelih ne vršijo nobene geometrijske transformacije.

Pri branju novega modela v pomnilnik se preverja konsistentnost podatkov. Ploskve morajo biti sklenjene z robovi, vse točke ploskve pa morajo ležati na isti ravnini. Koplanarnost točk se preverja tako, da se preverja vzporednost vseh normal ravnin, ki jih oklepajo sosednji robovi ploskve. Torej, kot med normalami mora biti 0° ali 180°, v vseh drugih primerih ploskev ni koplanarna. Pri numeričnem izračunu je seveda potrebno upoštevati toleranco kota 0.1°, drugače bi lahko prišlo do zapletov pri ploskvah, ki ne ležijo v glavnih ravninah koordinatnega sistema in so definirane z decimalnimi vrednostmi.



Slika 10 Preverjanje koplanarnosti ravnine

V slučaju, da sta sosednja robova vzporedna, je normala nedefinirana, zato se ta dva roba smatrata kot en sam rob.

Normala se izračuna z:

kot med dvema normalama pa:

Program omogoča tudi nastavitev enote dolžine koordinatnih osi, barvo koordinatnih osi, kot ene rotacije pogleda pri obračanju perspektive, velikost izpisa oglišč, robov in ploskev. Slednje lahko tudi poljubno vklapljamo in izklapljamo. Prav tako lahko skrijemo modele, da se ne izrisujejo, pri tem se zaslonske koordinate samodejno prilagodijo le modelom, ki so izrisani. Vsak model je izrisan s svojo barvo. Modele se po želji lahko tudi briše iz pomnilnika in namesto njih naložimo druge.


Slika 11 Primer brisanja modelov iz pomnilnika

Za brisanje pritisnemo tipko 'D'. Na zaslonu se izpišejo vsi komentarji naloženih modelov. Program zahteva navedbo vseh modelov, ki jih želimo izbrisati. V tem primeru želim izbrisati modela št. 1 in 3. Po brisanju se pojavi na ekranu Slika 12.


Slika 12 Zaslon po brisanju

Za interaktivno obračanje modelov tiščimo pritisnjeno tipko za obračanje tipke od 1 do 6. Pri takem obračanju je procesor zelo obremenjen z grafičnim delom programa, ker so fortranove rutine za risanje zelo počasne. Zato je priporočljivo, da se izklopi označevanje točk, robov in ploskev. S tem dosežemo mehkejše obračanje modelov. Za izklop prikaza oznak služi rutina KONFIGURACIJA. Ko program teče, jo sprožimo s tipko 'K', na ekranu se izpiše:

Spreminjamo lahko dolžino osi, barvo osi, kot, za katerega se bodo zavrteli modeli pri enem koraku interaktivnega vrtenja, velikost izpisa črk, vklapljamo lahko prikaz točk, robov ter ploskev, izris normal na ravnine. Nastavimo lahko faktor perspektivnega prikaza fo in preklapljamo med perspektivo in ortogonalno aksonometrično projekcijo. Oznaka 'T' oz. 'F' je kratica za angleški TRUE oz. FALSE.

Po izklopu točk, robov, ploskev in normal se izrišejo le osnovne konture modelov:

Ko zaključimo s programom se vsi podatki o modelih, ki so v pomnilniku in vseh nastavitvah samodejno shranijo v datoteko z imenom delovni.prj. Ob ponovnem zagonu programa se ta datoteka samodejno naloži. Prav tako lahko kadarkoli med delovanjem programa shranimo vse nastavitve in modele v poljubno datoteko ali jo naložimo.

Zaključek

Program je narejen po vseh zahtevah, ki so navedene v definiciji naloge. Namenjen je za prikaz 3D žičnih modelov na zaslonu. Vse rotacije, skalacije in translacije računa po predpisanem postopku. Uporablja nabor ukazov standarda GKS, razen pri izrisu ploskve (ukaz GPL), kjer sem zaradi hitrejšega izrisa raje uporabil fortranski ukaz lineto_w.

Pomanjkljivost programa je ta, da ne omogoča izrisa modelov na tiskalnik ali risalnik oz. ne omogoča izvoza datotek v standardnih formatih (npr. HGL, IGS, DXF). Prav tako ne omogoča združevanja dveh modelov v enega. To možnost bi lahko pričakovali pri volumskih modelirnikih.

Program je napisan je v jeziku F90, prevaja pa se lahko s prevajalnikom Fortran PowerStation 4.0. Izvorna koda je 32-bitna, zato potrebuje za delovanje Win95 ali WinNT.