Tekstuurien määritteleminen pinnoille VRML 1.0 -syntaksia käyttäen



Samankaltaiset tiedostot
Määrittelydokumentti

4.1 Kaksi pistettä määrää suoran

Luento 6: 3-D koordinaatit

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Luento 4: Kiertomatriisi

Datatähti 2019 loppu

Osoita, että kaikki paraabelit ovat yhdenmuotoisia etsimällä skaalauskuvaus, joka vie paraabelin y = ax 2 paraabelille y = bx 2. VASTAUS: , b = 2 2

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

0, niin vektorit eivät ole kohtisuorassa toisiaan vastaan.

Toinen harjoitustyö. ASCII-grafiikkaa

1 2 x2 + 1 dx. (2p) x + 2dx. Kummankin integraalin laskeminen oikein (vastaukset 12 ja 20 ) antaa erikseen (2p) (integraalifunktiot

VÄRISPEKTRIKUVIEN TEHOKAS SIIRTO TIETOVERKOISSA

Valitse aineisto otsikoineen maalaamalla se hiirella ja kopioimalla (Esim. ctrl-c). Vaihtoehtoisesti, Lataa CSV-tiedosto

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

T Vuorovaikutteinen tietokonegrafiikka Tentti

S11-04 Kompaktikamerat stereokamerajärjestelmässä. Projektisuunnitelma

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Pikaopas. Online-tilin näyttäminen tai vaihtaminen Jos käytät pilvipalvelua, voit muuttaa asetuksia tai vaihtaa tiliä valitsemalla Tiedosto > Tili.

Ohjeita kirjan tekemiseen

10. Esitys ja kuvaus

14 Monikulmiot 1. Nimeä monikulmio. a) b) c) Laske monikulmion piiri. a) 30,8 cm 18,2 cm. Laske sivun x pituus, kun monikulmion piiri on 25,0 cm.

Luento 2 Stereokuvan laskeminen Maa Fotogrammetrian perusteet 1

Koordinaatistot 1/6 Sisältö ESITIEDOT: reaaliluvut

9. Harjoitusjakso III

Luento 3: 3D katselu. Sisältö

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Matikkaa KA1-kurssilaisille, osa 3: suoran piirtäminen koordinaatistoon

Tässä osassa ei käytetä laskinta. Selitä päätelmäsi lyhyesti tai perustele ratkaisusi laskulausekkeella, kuviolla tms.

Algoritmit 2. Luento 6 To Timo Männikkö

MATEMATIIKKA 5 VIIKKOTUNTIA

M 1 ~M 2, jos monikulmioiden vastinkulmat ovat yhtä suuret ja vastinsivujen pituuksien suhteet ovat yhtä suuret eli vastinsivut ovat verrannolliset

Algoritmit 2. Luento 6 Ke Timo Männikkö

Yhtälönratkaisusta. Johanna Rämö, Helsingin yliopisto. 22. syyskuuta 2014

1. Jaa blini kolmella suoralla a) neljään, b) viiteen, c) kuuteen ja d) seitsemään osaan. Osien ei tarvitse olla samanlaisia. Piirrä suorat kuviin.

Excel syventävät harjoitukset

Demo 1: Simplex-menetelmä

a) Mitkä reaaliluvut x toteuttavat yhtälön x 2 = 7? (1 p.) b) Mitkä reaaliluvut x toteuttavat yhtälön 5 4 x

Pyramidi 4 Analyyttinen geometria tehtävien ratkaisut sivu 180 Päivitetty Pyramidi 4 Luku Ensimmäinen julkaistu versio

TL5503 DSK, laboraatiot (1.5 op) Kuvasignaalit. Jyrki Laitinen

Kenguru Ecolier, ratkaisut (1 / 5) luokka

Geodeettisen laitoksen koordinaattimuunnospalvelu

Juuri 3 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Webforum. Version 15.1 uudet ominaisuudet. Päivitetty:

Injektio (1/3) Funktio f on injektio, joss. f (x 1 ) = f (x 2 ) x 1 = x 2 x 1, x 2 D(f )

AV-muotojen migraatiotyöpaja - video. KDK-pitkäaikaissäilytys seminaari / Juha Lehtonen

Luento 7: Fotogrammetrinen mittausprosessi

Matematiikan ilmiöiden tutkiminen GeoGebran avulla

1. Skannaus ja tekstintunnistus (OCR) verkkoskannerilta

Kun olet valmis tekemään tilauksen, rekisteröidy sovellukseen seuraavasti:

Peruskoulun matematiikkakilpailu Loppukilpailu 2010 Ratkaisuja OSA 1

* Trigonometriset funktiot suorakulmaisessa kolmiossa * Trigonometristen funktioiden kuvaajat

4. Lausekielinen ohjelmointi 4.1

JUHTA - Julkisen hallinnon tietohallinnon neuvottelukunta

MAA3 TEHTÄVIEN RATKAISUJA

Taso 1. Yhden pelaajan pallokontrollitemput SORMILYÖNTI HIHALYÖNTI

Trigonometriset funktiot 1/7 Sisältö ESITIEDOT: reaalifunktiot

11.4. Context-free kielet 1 / 17

Approbatur 3, demo 1, ratkaisut A sanoo: Vähintään yksi meistä on retku. Tehtävänä on päätellä, mitä tyyppiä A ja B ovat.

Juha Haataja

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

Ohjelmistojen mallintaminen, mallintaminen ja UML

Graafinen ohjeisto 1

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

GeoGebra-harjoituksia malu-opettajille

Seuraa huolellisesti annettuja ohjeita. Tee taitokset tarkkaan,

Lisätehtäviä. Rationaalifunktio. x 2. a b ab. 6u x x x. kx x

Ota tämä paperi mukaan, merkkaa siihen omat vastauksesi ja tarkista oikeat vastaukset klo 11:30 jälkeen osoitteesta

Riemannin pintojen visualisoinnista

Kuvankäsittely. DigiReWork Annamari Mäenhovi Kati Nieminen

MATEMATIIKKA 5 VIIKKOTUNTIA. PÄIVÄMÄÄRÄ: 8. kesäkuuta 2009

Kenguru 2015 Ecolier (4. ja 5. luokka)

Teoreettisia perusteita II

Tasogeometria. Tasogeometrian käsitteitä ja osia. olevia pisteitä. Piste P on suoran ulkopuolella.

ATK tähtitieteessä. Osa 5 - IDL datan sovitusta ja muita ominaisuuksia. 25. syyskuuta 2014

2) Kaksi lentokonetta lähestyy toisiaan samalla korkeudella kuvan osoittamalla tavalla. Millä korkeudella ja kuinka kaukana toisistaan ne ovat?

Osaamispassin luominen Google Sites palveluun

Hahmon etsiminen syotteesta (johdatteleva esimerkki)


Kiipulan ammattiopisto. Liiketalous ja tietojenkäsittely. Erja Saarinen

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla (Opettajan ohje)

JAVA-OHJELMOINTI 3 op A274615

Puzzle-SM Loppukilpailu Oulu

Loppuraportti. Virtuaali-Frami, CAVE-ohjelmisto. Harri Mähönen projektiassistentti Seinäjoen ammattikorkeakoulu. Versio

ehr-järjestelmän käyttö palkka- ja kehityskeskusteluissa opasdfghjklzxcvbnmqwertyuiopasdfg

Kenguru Student (lukion 2. ja 3. vuosi) sivu 1 / 6

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Oppimateriaali oppilaalle ja opettajalle : GeoGebra oppilaan työkaluna ylioppilaskirjoituksissa 2016 versio 0.8

TEKSTINKÄSITTELY Aloitusharjoitus

KJR-C1001: Statiikka L2 Luento : voiman momentti ja voimasysteemit

Tietokonegrafiikan perusteet

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Excel-taulukkoon X- ja Y-sarakkeisiin tallennettujen koordinaattien muuntaminen paikkatietokohteiksi

2.8. Kannanvaihto R n :ssä

2 Pistejoukko koordinaatistossa

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Transkriptio:

Tekstuurien määritteleminen pinnoille VRML 1.0 -syntaksia käyttäen Maa-57.285 Fotogrammetrian ja kuvatulkinnan maastoharjoitukset Korvaava suoritus Erik Lindberg 38821E

1. Johdanto...4 2. Yleistä...5 2.1 Koordinaatisto...5 2.2 Esimerkkitekstuuri...6 2.3 VRML-koodi...6 3. Suorakulmainen kolmio...8 3.1 Pinnan normaali...9 3.2 Tekstuurikoordinaatit...10 4. Yleinen ratkaisu tekstuurin määrittelemiselle kolmion pinnalle...12 4.1 Ulkoinen tekstuuritiedosto...12 4.2 Tekstuurin määrittelyn normit...13 5. Johtopäätökset...16

Kuvat Kuva 1: Käytetty tekstuuri. Kuva on keltamusta ja kooltaan 50x50 pikseliä. Vasemman reunan musta viiva on vahvuudeltaan 5 pikseliä, yläviiva 2 pikseliä ja diagonaali 1 pikselin verran....6 Kuva 2: Edellisen VRML-koodin tuottama kuva selaimella. Kuvaa tarkastellaan täsmälleen pinnan normaalivektorin suunnasta. Sininen alue on määrittelemätöntä avaruutta...8 Kuva 3: Edellistä kolmiota on pyöritelty selaimella. Varsinkin läheltä tarkasteltaessa tekstuuri on erittäin karkea, mikä johtuu tekstuurikuvan matalasta resoluutiosta....8 Kuva 4: Tekstuuri näkyy silloin kun pintaa tarkastellaa pinnan normaalivektorin (N) ja pinnan määrittelemästä puoliavaruudesta käsin. Toiselta puolelta pinta on näkymätön, ellei tekstuuria erikseen määritellä...9 Kuva 5: Tekstuurikoordinaatit vaihtelevat välillä 0 1. Bittikartan vasen alareuna on origo...10 Kuva 6: Esimerkkitekstuuri, kun ulkoinen tekstuuritiedosto on GIF-formaatissa. Käyttämätön, valkoinen alue pakkautuu hyvin LZW-algoritmilla....13 Kuva 7: Esimerkkitekstuuri, kun ulkoinen tekstuuritiedosto on JPEG-formaatissa. Kuva jatkuu jonkin verran käytettävän tekstuurin ulkopuolelle, jottei tekstuurin reuna muutu epäselväksi.13 Kuva 8: Kuvalle saadaan oikea kiertosuunta, kun ensimmäiseksi pisteeksi valitaan min y ja toiseksi pisteeksi max x. Kiertosuunta on tällöin vastapäivään. Kuvassa on myös kolmiopinnan sivujen mitat (3D-avaruudessa)...14 Kuva 9: Tekstuurikoordinaatit kuvan 8 määrittelemälle kolmiolle, jos tekstuuritiedosto on neliön muotoinen....15 Kuva 10: Optimaalisesti valitut tekstuurikoordinaatit....15 Kuva 11: Optimaalisesti valittujen tekstuurikoordinaattien käyttämä kuvatiedosto. Kuvaa on skaalattu. Optimoinnin ansiosta kuvadatasta käytetään maksimaaliset 50%...15

1. Johdanto Tämä harjoitustyö käsittelee tekstuurien määrittelyä pinnoille VRML 1.0-syntaksin mukaisesti. VRML (Virtual Reality Modelling Language) on kolmiulotteisten mallien kuvauskieli, jota käytetään Internetissä. Standardi on avoin. Kieltä on kehitelty vuodesta 1994 lähtien. Tässä harjoitustyössä käsitellään version 1.0 mukaista syntaksia. Tähän päädyttiin, koska versio 1.0 sisältää tekstuurin määrittelyyn liittyvän syntaksin sekä erityisesti siitä syystä, että tälle standardille löytyy varmimmin tuki kaupallisista ja eikaupallisista ohjelmista. Harjoitustyön aihe liittyy käytännön ongelman ratkaisemiseen. Maanpintaa kuvaava valokuva halutaan tuoda kolmiulotteiseen esitykseen. Valokuva on tässä taso, joka halutaan kiinnittää koordinaateilla oikeaan asentoon määritellyssä XYZ-koordinaatistossa. Koska tehtävä ratkaistaan VRML-kielellä, ratkaisu on käyttöjärjestelmäriippumaton: tavallisimpiin käyttöjärjestelmiin on saatavissa VRML-selain. 4

2. Yleistä VRML-kieli on rakenteellinen kieli, joka määrittelee kolmiulotteisia tiloja. Tiloja muodostetaan kappaleprimitiiveistä: pallo (sphere), kuutio (cube), sylinteri (cylinder), kartio (cone). Näitä kappaleita täydentävät vapaastimääriteltävät tasot (IndexedFaceSet) ja murtoviivat (IndexedLineSet) (VRML Specification, 1994). Koska tässä työssä haetaan ratkaisua tekstuurin määrittelylle pinnalle, päädytään seuravaan: Tekstuuri määritellään vapaastimääritettävällä tasolle. Vapaastimääriteltävä taso muodostuu kolmioista. Kolmiotasoilla määritellään kaikki pinnat (niin kaarevat pinnat kuin myös tasot), joihin liitetään tekstuuri. Kaikki pinnat paitsi tasot määritellään siis kolmioina. Käytännössä tämä tapahtuu muodostamalla kolmiulotteinen TIN (triangular irregular network). Kolmioverkon kolmioiden määrä on siten suhteessa lopputuloksen laatuun: mitä enemmän kolmioita pinta-alayksikköä kohden sitä tarkempi lopputulos. Tasopinta voitaisiin määritellä n-kulmiona, jossa kaikkien kulmapisteiden koordinaatit sijaitsevat samalla tasolla. Käytännössä tason jakaminen kolmioverkkoon saattaisi kuitenkin olla selkeämpää varsinkin, jos ohjelmoitava kolmiulotteinen tila sisältäisi sekä kaarevia että tasopintoja. Tässä harjoitustyössä selvitetään, kuinka tekstuuri määritellään pintaprimitiiville. Ainoaksi primitiiviksi valitaan kolmiopinta. Tekstuuri määritellään 50x50 pikselin kokoisella bittikartalla. Tässä työssä bittikartan koko pidetään vakiona. Tämän työn esimerkkikuvat on tuotettu Microsoft Internet Explorerin VRML AddIn-ohjelmalla. Microsoft on lisensioinut WorldView-ohjelmistoon perustuvan VRML-selaimen InterVistalta. Valinta tehtiin, koska Netscapen VRML-selaimella esiintyi ongelmia tekstuurien renderoinnissa. Lisäksi Microsoftin tuote toisti värit paremmin. 2.1 Koordinaatisto VRML-kieli tukee kolmiulotteista suorakulmaista koordinaatistoa. Oletusorientoinnissa koordinaattiakselit osoittavat seuraaviin suuntiin (VRML Specification, 1994): X-akseli osoittaa oikealle Y-akseli osoittaa ylös Z-akseli osoittaa sisään kuvaruutuun. 5

2.2 Esimerkkitekstuuri VRML-standardi tukee niin ulkoisina tiedostoina kuin myös numerokoodein esitettyjä kuvia (VRML Specification, 1994). Kun kuva liitetään johonkin pintaan, siitä tulee tekstuuri. Ulkoiset kuvatiedostot voivat olla joko GIF- tai JPEG-standardin mukaisia kuvia. Numerokoodein voidaan kuvat sisällyttää VRML-koodiin. Tämä on hyvä keino, jos tekstuuri on hyvin yksinkertainen (esim. shakkiruutu, 4x4 pikseliä). Jos tekstuuri on esimerkiksi valokuvan osa, on ainoa järkevä keino ulkoisen tiedoston käyttäminen. Ulkoiset kuvatiedostot käyttävät useimmiten jotain kuvantiivistysalgoritmia. Esimerkkikuvan tiivistysalgoritmi on Lempel Ziv Welch -algoritmiin perustuva kuvantiivistysmenetelmä. Se soveltuu hyvin binäärikuviin tai kuviin joissa on alle 256 väriä. Mitä suurempia yhtenäisen värisävyn pinnat ovat sitä paremmin kuva tiivistyy. JPEG-kuvat on tiivistetty diskreettiin kosinimuunnokseen perustuen: se soveltuu paremmin luonnollisiin kuviin, missä siirtymiset kahden värin välillä tapahtuu vähitellen. Se on tehokas pakkausmenetelmä valkouville. (Lindberg, 1997.) Esimerkkitekstuuri on 50x50 pikselin kokoinen GIF-kuva. Sen tiedostokoko on 252 tavua. Kunkin pikselin värille on varattu 4 bittiä, tiivistämättömänä kuva veisi 1250 tavua tilaa. Pakkaamisella on saatu aikaan merkittävä tilan säästö. Käytännössä tämä tarkoittaa sitä, että kuva latautuu nopeammin. Tiedon pakkaaminen on erityisen tärkeää Internetissä, missä verkon hitaus tekee suurien tietomäärien siirtämisen tuskallisen hitaaksi (Lindberg, 1997). Kuva 1: Käytetty tekstuuri. Kuva on keltamusta ja kooltaan 50x50 pikseliä. Vasemman reunan musta viiva on vahvuudeltaan 5 pikseliä, yläviiva 2 pikseliä ja diagonaali 1 pikselin verran. 2.3 VRML-koodi Tässä harjoitustyössä ei perehdytä VRML-kielen yleiseen syntaksiin. Ainoastaan tehtävälle keskeisimpiä kohtia tarkastellaan. VRML-koodi esitetään tässä harjoitustyössä erilaisella 6

fontilla. VRML-koodi ei sisällä rivinumeroita, mutta tässä harjoitustyössä koodin rivit on numeroitu selkeyden vuoksi. 7

3. Suorakulmainen kolmio Ensimmäinen tekstuurikokeilu tehtiin suorakulmaiselle kolmiolle, jonka kateetit olivat yhtä pitkiä. Tarkoituksena on kiinnittää puolet esimerkkikuvan tekstuurista kolmion pinnalle. Tämä on mahdollisimman yksinkertainen tapaus, josta lähdetään liikkeelle. Seuraava VRML-koodi tarvittiin kolmiulotteisen mallin luomiseen: 1: #VRML V1.0 ascii 2: 3: Separator { 4: Texture2 { 5: filename koe.gif 6: } 7: TextureCoordinate2 { 8: point [0 1,0 0,1 1] 9: } 10: Coordinate3 { 11: point [-5 5 0,-5-5 0, 5 5 0] 12: } 13: IndexedFaceSet {coordindex [1, 2, 0, -1]} 14: } Listaus 1: Tekstuurin kiinnittäminen suorakulmaiseen kolmioon. Tekstuurista käytetään ainoastaan puolet. Kuva 2: Edellisen VRML-koodin tuottama kuva selaimella. Kuvaa tarkastellaan täsmälleen pinnan normaalivektorin suunnasta. Sininen alue on määrittelemätöntä avaruutta. Kuva 3: Edellistä kolmiota on pyöritelty selaimella. Varsinkin läheltä tarkasteltaessa tekstuuri on erittäin karkea, mikä johtuu tekstuurikuvan matalasta resoluutiosta. Ensimmäinen rivi kertoo selaimelle, että tieto on VRML 1.0-kieltä. Ensimmäisen rivin jälkeen on jätettävä tyhjä rivi. Rivien 4 6 Texture2-komento määrittelee tekstuuriksi koe.gif-tiedoston sisältämän kuvan. 8

Rivien 7 9 TextureCoordinate2 määrittelee, kuinka tekstuurin kuvakoordinaatit muunnetaan seuraavan pinnan sijaintikoordinaateiksi. Rivien 10 12 Coordinate3 määrittelee tässä esimerkissä kolme XYZ-koordinaattia, jotka määrittelevät kolmion nurkkapisteet. Tämä komento määrittellee ainoastaan koordinaatteja, jotka tallennetaan muistiin. Vasta seuraava komento määrittelee, kuinka pisteet yhdistetään. Rivin 13 IndexedFaceSet määrittelee pinnan, joka käyttää määriteltyä tekstuuria ja määriteltyjä 3D-koordinaatteja. Pinnan XYZ-koordinaatit annetaan määrittelemällä sen reunaviivojen pisteet järjestyksessä. Ne kuvataan järjestysluvulla (ensimmäinen XYZ-koordinaatti saa järjestysluvun 0), joka viittaa Coordinate3-komennolla annettuun XYZ-pisteeseen. 3.1 Pinnan normaali Ensimmäisessä esimerkissä kolmion sivut kierretään vastapäivään. Silloin, oikean käden säännön mukaan, pinnan normaali osoittaa katsojaa kohti. Tässä tapauksessa pinnan normaali osoittaa kuvaruudusta ulospäin, eli se on Z-akselin suuntainen. N Kiertosuunta Tekstuuri näkyy Tekstuuri on näkymätön Kuva 4: Tekstuuri näkyy silloin kun pintaa tarkastellaa pinnan normaalivektorin (N) ja pinnan määrittelemästä puoliavaruudesta käsin. Toiselta puolelta pinta on näkymätön, ellei tekstuuria erikseen määritellä. Pinnan normaali on tärkeä tekijä, koska tekstuuri näkyy ainoastaan siihen suuntaan, mihin pinnan normaalivektori osoittaa. Toinen puoli jää näkymättömäksi. Jos sama tekstuuri halutaan kiinnittää molemmille puolille, rivi 13 olisi seuraavanlainen: 13: IndexedFaceSet {coordindex [1, 2, 0, -1, 1, 0, 2, -1]} Silloin kolmion kärkipisteet kierretään ensin vastapäivään, jonka jälkeen samat pisteet käydään läpi myötäpäivään. Koska pisteet on määritelty samassa komennossa, ne käyttävät samaa tekstuuria. Koordinaatit ovat myös automaattisesti samat, koska kärkipisteiden järjestysnumerot viittaavat samaan Coordinate3:n määrittelemään koordinaattitaulukkoon. Jos kolmion molemmille puolille liitetään sama tekstuuri, ainoastaan kiertosuuntaa vaihtamalla, tekstuurit ovat toistensa peilikuvia. Käytännössä tämä aiheuttaa sen että, esimerkiksi tekstiä 9

sisältävä tekstuuri on luettavissa ainoastaan katseltaessa kohdetta oikealta puolelta. Väärältä puolelta teksti on peilitekstiä. Jatkossa tekstuuri määritellään ainoastaan toiselle puolelle. Jotta ikäviltä yllätyksiltä vältyttäisiin, kolmion kärkipisteet kierretään aina vastapäivään. Jos suurempaa kolmioverkkoa määriteltäessä ei pidättäydytä tässä sopimuksessa, lopputulos on tilkkutäkki, jossa osa kolmioista on näkymättömiä. 3.2 Tekstuurikoordinaatit Kuten jo aikaisemmin todettiin, TextureCoordinate2 määrittelee, kuinka tekstuurin kuvakoordinaatit muunnetaan seuraavan pinnan sijaintikoordinaateiksi. Koska tekstuuri määritellään kolmiolle, tekstuurikoordinaatteja on määriteltävä kolme. Tekstuurikoordinaatit ovat xy-koordinaattipareja, jotka viittaavat tekstuurina käytettävän kuvan pikselikoordinaatteihin, siten että: x y [ 0, 1] [ 0, 1] R, missä x on bittikartan sarakkeen suhde bittikartan leveyteen R, missä y on bittikartan rivin suhde bittikartan korkeuteen y (0,1) (1,1) Bittikartta (0,0) x Kuva 5: Tekstuurikoordinaatit vaihtelevat välillä 0 1. Bittikartan vasen alareuna on origo. Jos tekstuurina käytettävän bittikartan koko olisi esimerkiksi 640x320 pikseliä, niin tekstuurikoordinaattipari (0.1, 0.3) vittaisi pikselikoordinaattiin (64,96). Tässä harjoitustyössä käytetty selain ei interpoloinut pikseleiden väliin osuneille tekstuurikoordinaateille likiarvoja vaan valitsi lähimmän pikselin arvon. Tämä piirre aiheuttaa rakeisuutta kuvilla, jos tekstuurina käytetty bittikartta on pieni. Listauksen 1 riveistä 7 12 voidaan todeta, että valitut tekstuurikoordinaatit ja kolmion nurkkapisteiden 3D-koordinaatit muodostavat yhtenevät kolmiot. 7: TextureCoordinate2 { 8: point [0 1,0 0,1 1] 9: } 10: Coordinate3 { 11: point [-5 5 0,-5-5 0, 5 5 0] 12: } 10

Käytännössä tämä tarkoittaa sitä, että tekstuuri saadaan levitettyä kolmion pinnalle käyttämällä ainoastaan skaalausta. Tekstuurista leikatun kolmion kateettien pituus on 1, kolmiulotteisin koordinatein määritellyn kolmion kateettien pituus on 10. Koska kateetit ovat samanpituiset, kuvaan ei tule vääristymää kumpaankaan tekstuurikoordinaatin suunnassa. Tämä on johtava ajatus siinä vaiheessa, kun siirrytään tekstuurin määrittellyyn mielivaltaisesti valitulle kolmiolle. 11

4. Yleinen ratkaisu tekstuurin määrittelemiselle kolmion pinnalle Rakennettaessa VRML-maailmoja Internet-käyttöön suurin puute on hitaus. VRML-maailmat kuormittavat helposti verkkoa, ja joustava selaaminen tulee hankalaksi. Kun VRML-mallin rakentaminen painottuu tekstuureihin, kuvadatan käsittely nousee keskeiseksi asiaksi. Seuraavassa luvussa käsitellään mallin rakentamisvaiheessa huomioonotettavia seikkoja. Luvussa 4.2 käsitellään yleisten normien määrittelyä. Normit voidaan määritellä projektikohtaisesti, mutta niiden järjestelmällinen käyttö ja noudattaminen rakentaa hyvän pohjan siirryttäessä monimutkaisempiin malleihin. 4.1 Ulkoinen tekstuuritiedosto Tekstuuri määritellään ulkoisella tiedostolla. Ulkoinen tiedosto on aina muodoltaan mxn pikselin matriisi. Käytännössä tämä aiheuttaa sen, että jokaisessa tekstuurissa puolet pikseleistä jää käyttämättä. Koska tämä aiheuttaa turhaa tiedonsiirtoa, käyttämättä jäävä osa tiedostosta pitää saada tiivistettyä mahdollisimman tehokkaasti. GIF-kuvien käyttämä LZW-kompressio tiivistää tehokkaasti suuret yhtenäiset väripinnat, joten se on sopiva käyttötarkoitukseen. Suurissa tekstuuritiedostoissa JPEG-kuvien käyttämä kompressio on käyttökelpoisempi kuin LZW. Se soveltuu paremmin valokuvien ja luonnollisten kohteiden tiedontiivistämiseen. Jos kuvassa on jyrkkiä reunoja JPEG-kuvien koko kasvaa helposti suureksi. Tämä tulee ottaa huomioon määriteltäessä tekstuuria: tekstuurin raja ei saa olla jyrkkä. Seuraavat kuvat havainnolistavat, millainen tekstuuritiedoston sisältö on em. Kuvaformaateille erikseen. Punainen viiva on käytettävän tekstuurin raja. 12

Kuva 6: Esimerkkitekstuuri, kun ulkoinen tekstuuritiedosto on GIF-formaatissa. Käyttämätön, valkoinen alue pakkautuu hyvin LZW-algoritmilla. Kuva 7: Esimerkkitekstuuri, kun ulkoinen tekstuuritiedosto on JPEG-formaatissa. Kuva jatkuu jonkin verran käytettävän tekstuurin ulkopuolelle, jottei tekstuurin reuna muutu epäselväksi. 4.2 Tekstuurin määrittelyn normit Tässä luvussa määritellään normit tekstuurin määrittelemiseksi kolmionmuotoiselle tasolle. Normeja voidaan käyttää joko yhdessä VRML-projektissa tai niitä voidaan pitää perustana kaikissa uusissa projekteissa. Tämän harjoitustyön määrittelemät normit ovat vain murto-osa siitä, mitä pitää ottaa huomioon rakennettaessa VRML-maailmaa. Normit ovat tässä työssä eräänlaisia sääntöjä, joita säännöllisesti noudattamalla vältytään loogisilta ristiriidoilta. Loogisia ristiriitoja tekstuurin osalta ovat tekstuurin vääristymät, joita on kolmea eri tyyppiä (sekä niiden yhdistelmiä): 1. Tekstuuri on väärällä puolella pintaa (= näkymätön katselijan suuntaan) 2. Tekstuuri on kiertynyt (=tekstuurin kulmapisteet ovat eri kuin kolmiopinnan vastinpisteet) 3. Tekstuuri on vääristynyt (=tekstuurikoordinaattien muodostama kolmio ei ole yhtenevä kolmiopinnan kanssa) Ensimmäinen ja toinen ristiriita liittyvät samaan ongelmaan: tekstuurikoordinaatit ja kolmiopinnan koordinaatit eivät vastaa toisiaan. Jotta tämä virhe saataisiin eliminoitua, koordinaattipisteet tulee valita aina seuraavan periaatteen mukaan. 13

Periaate 1: Kolmiopinnan kiertosuunta on vastapäivään kolmiopinnan 1. piste on se piste, jonka y-koordinaatti on pienin. Jäljellejäävistä koordinaateista 2. piste on se, jonka x-koordinaatti on suurempi. Tällä menetelmällä pisteiden kierto saadaan oikeaan suuntaan eli vastapäivään. (1, 4, 4) 3. - 5.7 - max x 2. (5, 3, 0) - 6.0 - - 3.6 - min y (3, 0, 0) 1. Kuva 8: Kuvalle saadaan oikea kiertosuunta, kun ensimmäiseksi pisteeksi valitaan min y ja toiseksi pisteeksi max x. Kiertosuunta on tällöin vastapäivään. Kuvassa on myös kolmiopinnan sivujen mitat (3D-avaruudessa). Periaate 2: tekstuurikoordinaattien kiertosuunta on sama kuin kolmiopinnan. Tekstuurikoordinaatit on valittavat samassa järjestyksessä. Tämä takaa sen, että kierto-suunta säilyy samana (tekstuurin kiinnittämisen väärälle puolelle). Lisäksi tekstuurikolmion pitää olla yhtenevä (eliminoi tekstuurin vääristymät). Jos tekstuurin sisältämä kuvatiedosto olisi neliönmuotoinen (tekstuurikoordinaatisto olisi yhtenevä pikselien muodostaman koordinaatiston kanssa), määritellyt tekstuurikoordinaatit olisivat seuraavan kuvan mukaiset. 14

(0, 0.75) 3. 2. (1, 0.61) (0.76, 0) 1. Kuva 9: Tekstuurikoordinaatit kuvan 8 määrittelemälle kolmiolle, jos tekstuuritiedosto on neliön muotoinen. Kuvasta nähdään, että kuvatiedostosta käyttämättä jäävä alue on suuri. Tämä aiheuttaa turhaa tiedonsiirtoa. Tämän välttämiseksi kuvatiedosto ei voi olla neliönmuotoinen. Periaate 3: Tekstuuritiedoston kuva skaalataan siten, että se sisältää mahdollisimman paljon informaatiota Jos tekstuuritiedoston resoluutio on m x n pikseliä, niin skaalatun kuvan resoluutioksi valitaan m x k n, missä k = ((y max - y min )/(x max - x min )). Uudet tekstuurikoordinaatit ovat tämän kuvalle tapahtuvan skaalauksen jälkeen x x ja y y/k. Jos k>1, niin tekstuurikoordinaatit muunnetaan seuraavasti: x x k ja y y. Tekstuurikoordinaatit skaalataan siten niin, että ne ulottuvat välille [0..1]. (0, 1) 3. 2. (1, 0.81) n pikseliä 1. (0.76, 0) Kuva 10: Optimaalisesti valitut tekstuurikoordinaatit. m pikseliä Kuva 11: Optimaalisesti valittujen tekstuurikoordinaattien käyttämä kuvatiedosto. Kuvaa on skaalattu. Optimoinnin ansiosta kuvadatasta käytetään maksimaaliset 50%. 15

5. Johtopäätökset VRML-kieli on standardoitu. Sen sijaan menetelmät, joilla VRML-maailmoja rakennetaan, eivät ole. Kuinka kolmiulotteiset rakennetaan ja millä periaatteilla, jää ohjelmoijan harteille. Jotta VRML-maailmojen teko olisi mahdollisimman joustavaa, oppimisen tulee tapahtua kerralla. Tähän auttaa kurinalaisuus: rutiinit suoritetaan joka kerta samoin periaattein. Tämä harjoitustyö pukee sanoiksi sen, mitä pitää miettiä tehtäessä ensimmäisiä VRML-kokeiluja tekstuureille. Koska harjoitustyö liittyy ainoastaan tekstuurien määrittelemiseen pinnoille, tämä ei ole mikään yleispätevä teos. Tämä harjoitustyö luo normiston vain yhdelle pienelle osalle VRML-ohjelmointia. 16

Lähteet Lindberg, 1997. Lindberg, Erik. WWW-kartat ja kartografia. Erikoistyö. Espoo, 1997. VRML Specification, 1994. The Virtual reality Modelling Language. Version 1.0 Specification. 3 rd Draft - November 2, 1994. 17