OpenGL harjoitustyö

Tehtävä

Kirjoittaa OpenGL:ää käyttävä ohjelma, josta löytyy vaadittuja ominaisuuksia.

Toteutus

Ohjelmoitu Linux-alustalle C-kielellä. Tekstuurit ovat TGA-kuvia, jotka on pakattu gzip:llä (.tga.gz). Gzip pakkaus on tuettu kaikissa datatiedostoissa. Ohjelma ja materiaalit on julkaistu GPL:n alaisena.

Alustavaatimukset

Ohjelman ajokuntoon saattaminen

Hae paketti land-0.0.5.tar.gz (763kt). Tee sille oma hakemisto ja pura komennolla tar zxvf land-0.0.5.tar.gz.
Voit kokeilla suoraan kääntämistä komennolla make land, mutta jos se ei onnistu muokkaa Makefile tiedostoa. Jos käytät Mesaa, joudut ehkä muuttamaa GL-kirjastojen nimet tyyliin MesaGL.

Ohjelman käyttäminen

Komentorivi

Ohjelman voi ajaa suoraan komennolla ./land, mutta sille on myös useita parametreja:

-exit
Lopettaa ohjelman heti alustusten jälkeen.
-extensions
Tulostaa järjestelmäsi tukemat OpenGL-laajennukset. Mitään näistä ei kuitenkaan käytetä.
-v
Lisää ohjelman tulostamia kommentteja, maksimitaso on 4 eli -v -v -v -v.
-rec tiedosto
Nauhoittaa kameran polun tiedostoon reittipisteittäin. Välilyönti tallentaa reittipisteen.
-play tiedosto
Toistaa em. nauhoitusta silmukassa. Tiedosto voi olla nauhoituksen jälkeen pakattu gzip:llä.
-lin
Käyttää lineaarista interpolaatiota toistettaessa kamera-ajoa, mikä tekee liikkeestä töksähtelevää. Oletus on kuutiointerpolaatio, jolla saadaan pehmeämpi liike.
-low
Alhaisen laadun tila. Osa efekteistä puuttuu, käytetään karkeampia objekteja ja ikkunan oletuskoko on pienempi.

Demo

Suosittelen ensimmäisellä kerralla ajamaan komennolla
./land -play polku1.rec.gz

Kontrollit

Ohjelmaa kontrolloidaan näppäimistöllä ja hiirellä.
Nuolinäppäimillä liikutaan eteen, taakse ja sivuille, q lopettaa, ja välilyönti nauhoittaa reittipisteen, jos ollaan nauhoitustilassa.
Hiirellä vasemmalla näppäimellä raahaaminen muuttaa katselusuuntaa. Katselumalli on Euklidinen eli sopii hyvin maan pinnalla kulkevan hahmon malliksi, mutta avaruudessa se on hieman huono. Oikealla näppäimellä raahaaminen liikuttaa pysty- ja sivusuunnassa.
Hiiren keskinäppäimellä saa esiin valikon, josta voi kääntää valaistuksen, tekstuurit, sumun ja taskulampun päälle/pois ja vaihtaa rautalankamallin ja täytettyjen polygonien välillä ja varjostustyyliä.

Näyttö

Näyttö

Näytössä on muutamia tietoja:

Tehtävän pisteytys

Käyttöopas, 1p

No tässähän tämä.
+1p

Mallin geometria, 5-7p

Lähes kaikki objektit kasataan ensin display-listoihin (+1p).
Ohjelmassa voi valita rautalankamallin ja pintamallin välillä valikosta (+2p).
Kaikki geometriat ovat omia. Vaikka perustyyppejä ei olekaan kuin kolme plus pentagrammi, ansaitsen tästä mielestäni täydet pisteet (+3p).
Ensimmäinen perustyyppi on korkeuskartta, joka ladataan harmaasävykuvasta, jokaiselle verteksille lasketaan oma normaali kaikkien siihen liittyvien triangeleiden normaalien keskiarvona, ja lopuksi teksturoidaan.
Toinen perustyyppi on triangeleista tehty pallo. Sille verteksien normaalien laskeminen on helppoa, mutta tekstuurin on oltava pallopinnalle suunniteltu. Hain NASA:lta suoraan sopivat tekstuurit.
Kolmas ja yksinkertaisin perustyyppi on kuutio, jota tässä käytän nk. SkyBox:na.
Pentagrammia käytetään täysvalaistuna, joten sille en ole laskenut normaaleja. Pentagrammi on myös kasattu triangeleista.
Valmiita geometrioita (tarkoittaa ilmeisesti glut-kirjaston objekteja) ei ole käytetty lopullisessa versiossa (+0p). Paitsi yksi glutWireSphere lens flarejen koodissa tähden näkyvyyden tunnistamiseksi.
Muunnosmatriiseja vilisee joka puolella; glTranslatef ja glRotatef tavallisimmat, mutta myös glScalef löytyy. Matriisipinoja (glPushMatrix/glPopMatrix) on käytetty ahkerasti. Omia muunnosmatriiseja ei muistaakseni ole käytetty. (+4p)
+7p

Projektion määritys, 2-3p

Täydet pisteet totta kai (+3p)
Kuvaportti ja projektio on määritelty niin, että ikkunaa venyttäessä suhteet pysyvät vakioina eli kuva ei veny. Kuvan "zoom" määräytyy korkeuden mukaan ja leveys vaikuttaa näkökenttää sivusuunnassa.
Kamera on käyttäjän hallittavissa.
Lisäksi pari efektiä, pentagrammin säteily ja lens flaret, bittikarttatekstin piirtäminen ja kohteen tunnistus (target) joutuvat joutuvat asettelemaan omia kuvaportin ja projektion määrityksiään. Lähdekoodi kertoo parhaiten.
+3p

Näkyvät pinnat, 0-2p

Ohjelma käyttää backface cullingia ja z-bufferia.
Ainoastaan lens flarejen näkyvyyden tunnistamisessa en saanut z-bufferia toimimaan halutulla tavalla; flaret näkyvät, vaikka tähti olisi objektin takana piilossa.
+2p

Mallin valaisu, 0-3p

Tähden valossa on ambient-komponentti, vaikka se ei juuri näykään. Muuten tähden valo tulee äärettömän kaukaa eli on suunnattu valo.
Pentagrammi sisältää punaisen pistemäisen valonlähteen, josta lähtevän valon intensiteetti vaimenee.
Kameraan on pultattu taskulamppu eli spottivalo, jonka intensiteetti myös vaimenee etäisyyden mukaan.
+3p

Pintojen ominaisuudet, 1-4p

Kaikki pinnat, paitsi pentagrammissa, ovat teksturoituja, sekä mip-mapattuja poislukien SkyBox.
Shading-asetusta voi muuttaa ajon aikana.
Lisäksi osa tekstuureista luodaan ohjelmallisesti. Lens flaret luodaan ohjelman alussa, ja pentagrammin säteilyefektin tekstuuri luodaan kerran framessa.
+4p

Interaktiivisuus, 3-5p

Ohjelmasta löytyy menu, se lukee tekstuurit .tga(.gz) tiedostoista ja kamera-ajon tiedostosta, poiminta/osoitus on näytön target eli näyttää tähdätyn objektin nimen.
Zoomaus, panorointi ja kameran määritys tulevat kaikki kameran liikuttelusta.
Taskulampun saa päälle ja pois, ja se liikkuu kameran mukana.
+5p

Animaatio, 0-3p

Ohjelmaan on määritelty aikafunktio, jota kutsutaan normaalisti 40-50 kertaa sekunnissa. Se puolestaa kutsuu objektien rekisteröimiä advance-funktioita antaen parametrina todellisen ajan ohjelman alkamisesta. Näin objektien liike on tasaista (ellei koneteho lopu kesken) ja reaaliaikaan sidottua.
Sama systeemi kutsuu myös kameran advance-funktiota kamera-ajomoodissa (-play).
Kamera-ajon käydessä käyttäjä ei voi vaikuttaa liikkeeseen, mutta voi käyttää menua.
+3p

Muut ilmiöt, 0-3p

Mustaa sumua (kts. Demo) löytyy.
Teksti piirretään glut:n bittikarttafontteja hyväksikäyttäen.
Pentagrammin efektissä koko renderöintisyklin aluksi renderöidään pelkkä pentagrammi ja kopioidaan tulos tekstuuriksi. Myöhemmin tektuuri piirretään triangeleina pentagrammin päälle blendattuna useaan kertaan.
Lens flaret piirretään myös blendattuina triangeleina, jotka sijoitetaan kuvaportin koordinaateissa.
+3p

Yhteensä: 31p

Kiitokset

Kuvakaappauksia

Kuvaa klikkaamalla saat sen auki suurempana.

Peruskuva. pic
Peruskuva rautalankamallina. pic
Rautalankamalli ilman tekstuureja, valoja ja sumua. pic
Ilman tekstuureja, Smooth Shading.
(Pentagrammin efektissä tekstuuri)
pic
Ilman tekstuureja, Flat Shading
(Pentagrammin efektissä tekstuuri)
pic
Lens Flares pic
Pentagrammi ja sen efekti pic
Pentagrammin efektin piirtoalue ja kerroksellisuus näkyvät selvästi tässä kehityksen aikana otetussa kuvassa. pic
Maa ja kaksi Kuuta pic
Yleiskuva hieman kauempaa, Justinin hieno tähtisumu taustalla. pic
Taskulamppu valaisee Kuuta, objektissa käytetyt triangelit erottuvat selvästi. Huomaa Target-näyttö. pic

Edellisten lisäksi kehityksen aikana napattuja kuvia löytyy sekalainen joukko täältä.