VRML-opas aloittelijalle
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