Damjan Čelič
24. junij, 2002
Za izdelavo prostorskih geometrijskih modelov je najenostavneje uporabiti grafični jezik OpenGL. Zaradi svoje odprtosti, zmogljivosti in enostavnosti za uporabo, se je OpenGL uveljavil na vseh operacijskih sistemih in strojnih platformah.
Jezik OpenGL je konstruiran kot strojno neodvisen vmesnik med programsko kodo in grafičnim pospeševalnikom. To pa pomeni tudi to, da OpenGL nima uporabniškega vmesnika, ki bi ga povezoval z okenskim sistemom. Zaradi različnih specifikacij okenskih sistemov, pa splošen uporabniški vmesnik ni možen. Zato se je izdelala knjižnica GLUT (GL Utility), ki vse razlike med operacijskimi sistemi kompenzira in vpeljuje skupen način manipuliranja z dogodki (events). S knjižnico GLUT je tako mogoče pisati prenosljive programe, ki so enostavni za programiranje in dovolj zmogljivi za nezahtevne uporabniške vmesnike.
Program pišemo v programskem jeziku Fortran [2] in v sintaksi vključujemo (kličemo) ukaze iz knjižnice GLUT. Programsko kodo potem s prevajalnikom prevedemo v program s končnico exe. Vse kar je potrebno vedeti o vključevanju in uporabi grafične knjižnice GLUT, je razloženo v literaturi [1], ki se nahaja na domači strani LECAD-a.
Enostaven model hiše je zgrajen iz kvadra in tristrane prizme, ki je položena na kvader tako, da predstavlja streho hiše. Tako kvader kot tudi prizma se morata izrisati skladno z vhodnimi podatki.
Kvader sestavimo iz šestih ploskev, od katerih so nasprotne ploskve paroma dimenzijsko enake. To pomeni, da sta enaki sprednja in zadnja ploskev (višina x širina), leva in desna ploskev (višina x dolžina), ter spodnja in zgornja ploskev (širina x dolžina). Torej mora program risati tri dimenzijsko različne pravokotnike, ki jih najenostavneje sestavimo skupaj v kvader tako, da postavimo koordinatni sistem v težišče bodočega kvadra in ga potem rotiramo okrog x oziroma y osi, ter transliramo po z osi. Pravokotnike vedno rišemo v x-y ravnini. Nekoliko bolj enostaven primer kocke je razložen v literaturi [1].
Slika1: Kvader
Sedaj ko imamo kvader izrisan, se lahko lotimo strehe. Privzemimo, da je kot naklona strehe vedno alfa = pi/6 [rad]. Če označimo s h najvišjo točko slemena, potem lahko izračunamo:
Program je zasnovan tako, da postavi streho vedno vzdolž daljše dimenzije hiše. Torej velja zgornja enačba le v primeru, ko je dolžina daljša od širine, v nasprotnem primeru pa velja enačba:
Za začetek vzemimo, da je fasada rumene barve, kritina pa rdeče. Tako se odločimo predvsem zardi lepšega prikaza zaporedja operacij, ter boljše prostorske predstave. Kako so barve vnesene v model, bo razloženo kasneje.
Izrisa strehe se lotimo tako, da premaknemo izhodišče koordinatnega sistema s težišča kvadra v najvišjo točko slemena (translacija za h po y-osi). Nato le še zarotiramo K.S. v ravnino nagiba strehe in izrišemo šestkotnik, ki predstavlja polovico strehe. Podobno izrišemo tudi drugi krak strehe. Tako dobimo hišo z odprtim ostrešjem, zaenkrat še brez čopov.
Slika2: Hiša z odprtim ostrešjem
Hiša z zaprtim ostrešjem nastane, ko na prednji in zadnji strani hiše narišemo trikotnika z nagibom v barvi kritine, ki predstavljata čope, ter trapeza v barvi fasade, ki predstavljata podstrešni steni. Risanje trikotnikov in večkotnikov v prostoru je razloženo v literaturi [1].
Slika3: Hiša s čopi in zaprtim ostrešjem
Izrisa oken se lotimo s podobno logiko glede orientacije hiše kot pri strehi. Recimo da bo imela naša hiša dve okni na čelni strani (pročelju), ter vrata in okno na vidni bočni strani. Z uporabo IF zanke pri pogoju d > s dosežemo željeni učinek. Lokacijo ter velikost oken in vrat definiramo po vizualnem estetskem okusu glede na vhodne parametre d, s, in v.
Slika4: Hiša s čopi ter z okni in vrati
Preostane nam samo še rešitev problema vnosa barv. To najbolj elegantno rešimo na ta način, da definiramo dva trikomponentna vaktorja f in k, ki bosta podajala informacijo o barvi fasade in barvi kritine. Željeno barvo dobimo z uporabo RGB barvne sheme. Barvi fasade in kritine sta torej v programu vnaprej opredeljeni in ju lahko popravlajmo v DATA stavku. V programu tako uporabimo naslednji sklop stavkov:
real f(3), k(3)
data f /1,1,0/, k /1,0,0/
call fglColor3f(f(1), f(2), f(3))
call fglColor3f(k(1), k(2), k(3))
Slika5: Hiša s čopi kot jo izriše program
Programsko kodo si lahko ogledate tukaj:
Program deluje v okenskem okolju Microsoft Windows in ga je mogoče preizkusiti tukaj:
Seveda pa program ne more delovati brez GLUT knjižnice, oziroma datoteke glut32.dll, ki ga v skompresirani obliki lahko dobite tukaj: