VRML-opas aloittelijalle

Marko Myllymaa, 44581j

Sisältö:

Yleistä
VRML:n syntaksi
Geometriset kappaleet
Kartio
Kuutio
Pallo
Sylinteri
Itse tehdyt kappaleet
2D-teksti
Muunnokset
Materiaalit
Pinnoitteet
Kamerat
Perspektiivikamera
Ortogonaalinen kamera
Valot
Kohdevalo
Pistevalo
Suunnattu valo
WWW ankkurit
Lähteet
Linkkejä
VRML oppaita
VRML selaimia ja plugineja

VRML (Virtual Reality Modeling Language) on tarkoitettu 3D-maisemien kuvaamiseen internetissä. Tarkoitukseni on opastaa alkuun VRML 1.0 mukaisen dokumentin tekemisessä.
VRML kehitettiin, koska haluttiin kuvata 3-ulotteisia maailmoja internetissä. Eikä tämä onnistunut niin, että palvelin hoitaisi kaiken laskemisen ja lähettäisi sitten lasketut kuvat käyttäjille. Mikää kone ei olisi riittänyt palvelimeksi eikä sitä kuvadataa olisi kuitenkaan onnistuttu siirtämään internetin yli riittävän nopeasti. Tästä syystä siirrettävä data sisältää ainoastaan maailman generointiin tarvittavan ohjauskoodin. Varsinainen kuvan muodostus ja renderöinti tapahtuu käyttäjän koneessa. Tällöin verkon kuormitus on huomattavasti pienempi verrattuna siihen, että palvelimelta ladataan joka kuva ja käyttäjä lähettää omat ohjauskoodinsa palvelimelle. VRML-maailman koordinaatistossa x-akseli osoittaa ruudulla oikealle, y-akseli ylöspäin ja z-akseli ruudusta ulospäin. Eli koordinaatisto on oikeakätinen.

VRML-syntaksi

VRML 1 standardin mukainen dokumentti alkaa rivillä:
#VRML V1.0 ascii
Tämä ilmoittaa selaimelle, että on kyse VRML-dokumentista ja nimenomaan VRML 1.0 dokumentista ascii-muodossa. Tämän jälkeen itse dokumentin runko on jaettu erottimilla (Separator) kapseleihin, joiden sisällä voidaan tehdä määritelmiä, jotka eivät vaikuta toisten kapseleiden sisältöihin.
Separator {
          [koodia]
          } #Tässä loppuu Separator:lla tehty kapseli.
#-merkin perään voidaan kirjoittaa kommetti.
VRML:n funktiot näyttävät lähes samanlaisilta kuin kapselit. Mutta ne ovat käskyjä selaimelle. Esimerkiksi
Sphere 	{
	...
	}
piirtää pallon. Funktiossa aaltosulkeiden sisällä määritetään ko. funktion muuttujat. Esimerkiksi:
Sphere 	{
	radius 20
	}
Funktiolla ei välttämättä tarvitse olla yhtään argumenttia. Eikä niitä tarvitse kaikkia käyttää, osalla argumenteista on olemassa oletusarvo, jos käyttäjä ei sitä määrittele.
Seuraavassa selitetyt esimerkit helpoimmista ja käytetyimmistä funktioista VRML:ssä. Itse esimerkeissä on käytetty apuna Pete's Easy VRML Guide:a [2].

2D-teksti [1, 2]

2 ulotteista tekstiä maailmaan saa AsciiText-funktiolla.
AsciiText {
	string "Tämä on ascii-tekstiä."
	spacing 1
	justification CENTER
	width 0
}
Tässä justification voi saada arvot: LEFT, CENTER tai RIGHT. Se määrää origoon kuvautuvan osan tekstistä. Widht määrittää tekstin maksimileveyden. Jos teksti kuitenkin on tätä leveämpi, niin sitä skaalataan pienemmäksi.

Fontit [1, 2]

FontStyle-nodella valitaan käytettävä fontti, sen tyyli ja koko.
Separator {
	FontStyle {
		size 10
		family SERIF
		style NONE
	}
}
Käytettävän fontin määrää muuttuja family. Sen vaihtoehdot ovat:
SERIF       (vastaa Times-Romania)
SANS        (vastaa Helveticaa)
TYPEWRITER  (vastaa Courieria)
Vaihtoehdot style muuttujalle ovat:
NONE    (normaali teksti)
BOLD    (lihavoitu)
ITALIC  (kursivoitu)
Size määrää fontin korkeuden kappaleavaruuden pisteissä. Se määrää myös

Geometriset kappaleet

Kartio [1, 2, 4]

Separator{
	Cone {
		parts ALL
		bottomradius 15
		height 30
	}
}
Tässä parts tarkoittaa kartion eri osia, jotka halutaan piirtää. Sen arvoina voi olla SIDES, BOTTOM tai ALL.

Kuutio [1, 2, 4]

Separator{
	Cube {
		width 30
		height 30
		depth 30
	}
}

Pallo [2, 4]

Separator{
	Sphere {
		radius 10
	}
}

Sylinteri [1, 2, 4]

Separator {
	Cylinder {
		parts ALL
		radius 12
		height 20
	}
}
Tässä parts-muuttujan arvot voivat olla TOP, BOTTOM, SIDES tai ALL.

Itse tehdyt kappaleet [1,2]

Muiden kappaleiden teko onnistuu Coordinate3, IndexedFaceSet ja IndexedLineSet nodeilla. IndexedFaceSet:llä voidaan tehdä objekteja, jotka koostuvat pinnoista. Ja vastaavasti IndexedLineSet:llä saadaan tehtyä rautalankamalleja eli wireframeja. Coordinate3 nodella voidaan luoda pisteitä maailmaan. IndexedFaceSet:llä voidaan sitten piirtää pinta valittujen pisteiden väliin. -1:llä erotetaan eri pinnat. Vastaavasti IndexedLineSet:ssä -1 erottaa viivat toisistaan. Esimerkki määrittelee heksaedrin, jonka kulmat ovat akseleilla 10:n yksikön päässä origosta.
Separator {
	Coordinate3 {
		point [
		0 10 0,
		10 0 0,
		0 0 10,
		-10 0 0,
		0 0 -10,
		0 -10 0,
		]
	}
	IndexedFaceSet {
		coordIndex [
			0, 1, 2, -1,
			0, 2, 3, -1,
			0, 3, 4, -1,
			0, 4, 1, -1,
			5, 1, 2, -1,
			5, 2, 3, -1,
			5, 3, 4, -1,
			5, 4, 1, -1,
			]
	}
}
Ja sama rautalankapiiroksena:
Separator {
	Coordinate3 {
		point [
		0 10 0,
		10 0 0,
		0 0 10,
		-10 0 0,
		0 0 -10,
		0 -10 0,
		]
	}
	IndexedLineSet {
		coordIndex [
			0, 1, -1,
			0, 2, -1,
			0, 3, -1,
			0, 4, -1,
			1, 2, -1,
			2, 3, -1,
			3, 4, -1,
			4, 1, -1,
			5, 1, -1,
			5, 2, -1,
			5, 3, -1,
			5, 4, -1,
			]
	}
}

Muunnokset [1, 2]

Transform-nodella voi skaalata, kiertää tai siirtää objektia.
Transform {
	translation 0 10 0
	rotation 0 0 1 2.5
	scaleFactor 1 1 2
	center 2 2 2
}
Translation määrittää vektorin, jonka verran objektia siirretään. Rotation määrittää akselin, jonka ympäri kierto tapahtuu. Viimeinen (neljäs) argumentti on positiiviseen kiertosuuntaan kierretävä kulma radiaaneina. ScaleFactor on kerroin, jolla objekti skaalataan. Sille voi antaa kertoimet jokaiselle akselille. Center:llä voi määrittää pisteen, jonka ympäri kierto tapahtuu. Eli translation ei määritä varsinaista suoraa vaan ainostaan suunnan.

Tämän lisäksi on vielä translation-node, jolla voi tehdä pelkkiä siirtoja:
Translation {
	translation 10 0 0
}

Materiaalit [1, 2, 4]

Material-nodella voi antaa objektien pinnoille värin ja heijastuvuuden.
Material {
	ambientColor 0.2 0.4 0.3
	diffuseColor 0.8 0.6 0.6
	specularColor 0.3 0.2 0.5
	emissiveColor 0.7 0.3 0.6
	shininess 0.3
	transparency 0
}
AmbientColor määrittää värin, jonka objekti heijastaa tasaisesti riipumatta kuvaus- ja valaisukulmista. DiffuseColor määrittää värin, joka objektista heijastuu ottaen huomioon miten suoraan valo kohtaa pinnan. SpecularColor ja shininess määrittävät esim. millainen heijastus palloon tulee lampusta. Pienempi shininess:n arvo saa aikaan pehmeämmän heijastuksen ja suurempi terävämmän. EmissiveColor on väri, jota objekti säteilee. Transparency on objektin läpinäkyvyys, 0 on kiinteä ja 1 on täysin läpinäkyvä. Kaikki PC pohjaiset renderöintijärjestelmät eivät tue kaikkia materiaalimäärityksiä [1]:
Muuttuja:	Tuetaanko:	Mahdollinen käyttö:
ambientColor	ei		
diffuseColor	kyllä		perusvärinä
specularColor	ei		
emissiveColor	ei		
shininess	kyllä		kyllä
transparency	ei		

Pinnoitteet [1, 2, 4]

Objekteiden pinnoille voi laittaa pinnoitteen Texture2-pisteellä. Pinnoitteet voivat olla JPEG-, PNG- tai GIF-muodossa olevia kuvia.
Texture2 {
	filename "kuva.jpg"
}
Lainausmerkeissä annetaan kuvan URL, eli sen ei tarvitse sijaita samalla palvelimella. Lainausmerkeissä voi olla esim: kuva.jpg, pics/kuva.jpg tai http://www.joku.kone.fi/kuvat/kuva.jpg .

Kamerat

VRML:ssä on kaksi erilaista kameratyyppiä: Perspektiivikamera ja ortogonaalinen kamera. Perspektiivikamera on ns. tavallinen kameratyypi. Siinä objektit pienenevät kauemmas. Ortogonaalinen kamera taas säilyttää objektien koon huolimatta etäisyydestä. Siinä siis kuution sivut ovat samansuuntaiset, kun taas perspektiivikamerassa ne ovat kauempana lähempänä toisiaan.

Perspektiivikamera [1, 2]

PerspectiveCamera {
	position 0 0 1
	orientation 0 0 1 0
	focalPoint 5
	heightAngle 2
}
Position määrittää kameran paikan. Orientation sen suuntavektorin ja kiertokulman tämän vektorin ympäri. FocalPoint antaa selaimelle vihjeen siitä mille etäisyydelle maailmassa ollaan kiinnostuneita. Eli jos sen arvo on 5 ja olemme menossa objektin luokse, jonne on matkaa 50, niin silloin selaimen pitäisi liikkua ainakin aluksi nopeammin. HeightAngle kertoo korkeuskulman, jolla kamera kuvaa alaspäin.

Ortogonaalinen kamera [1]

OrthographicCamera {
	position 0 0 1
	orientation 0 0 1 0
	focalDistance 5
	height 2
}

Valot

VRML:ssä valoja on kolme erilaista: Kohdevalo, pistevalo ja suunnattu valo.

Kohdevalo [1, 2, 3]

SpotLight-node määrittää kohdelampun, joka valaisee kartion mallisen alueen. Esimerkiksi katulamppu on tällainen.
SpotLight {
	on TRUE
	intensity 1
	color 1 1 1
	location 0 0 1
	direction 0 0 -1
	dropOffRate 0
	cutOffAngle 0.785398
}
Tässä dropOffRate määrittää vaimennuskertoimen ja cutOffAngle kulman, jonka ulkopuolelle lamppu ei valaise. Intensity on lampun voimakkuus eli kirkkaus. Maksimi on 1 ja minimi 0.

Pistevalo [1, 3]

PointLight määrittää lampun, joka valaisee joka suuntaan yhtä voimakkaasti, eli pistevalon.
PointLight {
	on TRUE
	

Suunnattu valo [1, 3]

DirectionalLight-node määrittää lampun, joka valaisee ainostaan direction-muuttujan määräämään suuntaan. Tällaisen voi kuvitella olevan suuri valoseinä, joka siis valaisee ainostaan suoraan valoseinästä ulospäin.
DirectionalLight {
	on TRUE
	intensity 1
	color 1 1 1
	direction 0 1 0
}

WWW ankkurit [2]

VRML:ään voi laittaa tavallisisa WWW-linkkejä, joita klikkaamalla saa selaimen lataaman määritetyn sivun aivan samalla tavalla kuin tavallisessa HTML:ssä.
WWWAnchor {
	name "http://www.hut.fi"
	{
	Sphere { }
	}
}
Eli lainausmerkkien sisällä voi antaa minkälaisen URL:n tahansa, vaikka mailto:n tai ftp:n. Yo. esimerkisä siis palloa klikkaamalla pääsee TKK:n kotisivulle.
Kaikkia objekteja ei pysty tai ei ole mielekästä tehdä käsin. Myös tunnetuimpia 3D-CAD-ohjelmia voidaan kättää. CAD-ohjelmilla tehdyt objektit sitten muutetaan tarvittavalla konvertointiohjelmalla VRML-muotoon. [5]

Lähteet

[1] VRML 1.0 Specifiction [2.11.1997] <http://www.vrml.org/VRML1.0/vrml10c.html> *****
VRML1.0:n määritykset.
[2] Pete's Easy VRML Tutorial [2.11.1997] <http://www.mwc.edu/~pclark/vrmltut/html> ****
Esimerkkejä helpoimpien VRML-nodien käytöstä.
[3] VRML Node Quick Reference [2.11.1997] <http://reality.sgi.com/chris_manchester/vrml/vrml2.0/nodesRef.html> ****
Selitetty VRML2.0:n yleisimmät nodet ja niiden argumentit.
[4] A Beginner's Guide to VRML [2.11.1997] <http://oem.netscape.com/eng/live3d/howto/vrml_primer_body.html> ***
Suppea opas, mutta hyvät esimerkit.
[5] VRML konvertoijia [12.11.1997] <http://www.gertstein.org/hal/vrmledit.html> ***
Joitakin konvertointiohjelmia 3d->VRML.

VRML-linkkejä

Helsinki Arena 2000 [12.11.1997] <http://www.helsinkiarena2000.fi/> *****
Virtuaalinen Helsinki sekä muita linkkejä muihin virtuaalikaupunkeihin.
The VRML Repository [2.11.1997] <http://www.sdsc.edu/vrml> *****
Erittäin kattava VRML-linkkikokoelma.
VRML-CD-QUE-MacMillan Publishing [12.11.1997] <http://www.cascade.net/~monalisa/Webpages/select.htm> *****
Objekteja, linkkejä, selaimia ja VRML1.0:n ja 2.0:n ääritelmät.
Terra Vista [12.11.1997] <http://www.terravista.org/> ****
Virtuaaliyhteisö WWW:ssä.
Pete's Page [2.11.1997] <http://www.mwc.edu/~pclark> ***
Helppo opas ja muutama linkki.
Mars Pathfinder VRML Visualization [12.11.1997] <http://img.arc.nasa.gov/archive/pathfinder/pathvrmlintro.htm> ***
Kuvia Pathfinderista ja Marsista.
VRML Objects and Worlds [12.11.1997] <http://www.ionet.net/~vertigo/vrml/vrml.html> **
Muutama objekti (Star Trek) ja yksi maailma.
VRML from the Mining Company [2.11.1997] <http://vrml.miningco.com> ***
Aika paljon asiaa VRML2.0:sta.

VRML oppaita

Chris Thorrnborrows VRML Page [2.11.19971] <http://reality.sgi.com/chris_manchester/vrml.html> *****
Paljon VRML:stä, mm. hyvä opas.
VRML Tutorial [2.11.1997] <http://www-personal.umich.edu/~emdanat/VR/VRML/Tutorial.htm> ***
VRML1.0 opas sekä 1.0:n ja 2.0:n määritykset.
The Guide to VRML [2.11.1997] <http://www.astronomy.ohio-state.edu/~stephens/vrml> ***
Melko paljon VRML:stä, virheellisiä linkkejä muutama.
CPS616 Spring97 VRML Resources [12.11.1997] <http://www.npac.syr.edu/projects/cps616spring97/vrml.html> *****
Erittän paljon VRML1.0:sta ja 2.0:sta, oppaita, objekteja jne.

VRML selaimet ja pluginit

VRML Repository: Browsers and Plug-ins <http://www.sdsc.edu/vrml/cgi-bin/display.cgi?category=Browsers+and+Plug-ins&> *****
Paljon linkkejä ja selostuksia selaimista.
VRML Information - Intervista Software [2.11.1997] <http://www.intervista.com/vrml/index.html> ****
Intervista VRML plugin ja paljon muutakin asiaa VRML:stä.
Cosmo Player [2.11.1997] <http://cosmo.sgi.com> **** (?)
Silicon Graphicsin tekemä plugin. Toimii ainakin uudemmissa Netscapeissa. Sivuilla myös jonkin verran objekteja. Palvelin välillä kaaduksissa.

Marko Myllymaa, Last modified 2.11.1997