[Index] [Vad är VRML?] [Syntax] [Optimering] [Bläddrare] [Världsmodellerare] [Historik]

 Föregående sida

Förvalda värden (normalvärden) och fältvärdestyper

Som vi nämnt tidigare har alla noder förvalda värden (eng. default values) för sina olika fält. Detta är alltså värden som enligt VRML-specifikationen ska fungera som fördefinierade värden hos VRML-bläddraren i de fall då ett fält inte specificeras i VRML-filen. ("In default of" betyder på svenska "i brist på" och en alternativ översättning av "default value" till svenska skulle kunna vara "bristvärde". Översättningen "normalvärde" förekommer också.)

Låt oss titta lite närmare på syntaxen för ett par av de noder vi hittills använt. För Box { } -noden ser detta ut som

Box {
size 2 2 2 field SFVec3f
}
Detta betyder att om inget fält med tillhörande värde i Box { } -noden anges kommer VRML-bläddraren att tillgodogöra sig det förvalda värdet (2 2 2) och göra en kub med sidan 2. Texten i normalstil som följer fältvärdet ovan anger vilken typ av fältvärde det är. SFVec3f betyder exempelvis att fältvärdet är en tredimensionell flyttalsvektor, där SF (single-value) anger att det rör sig om ett enda värde (till skillnad mot MF för multiple-value).

Det finns två slags fält, field och exposedField. Den förra definierar initialvärdet för en nods tillstånd och kan inte ändras utifrån, medan den senare kan ändras utifrån t ex genom koppling med en annan nod.

När vi beskriver de enskilda nodernas exakta syntax kommer vi i fortsättningen alltid att ha med information om fält- och fältvärdestyp. Så är de även beskrivna i VRML-specifikationen.

På motsvarande sätt betyder det att om man använder Material { } -noden utan att ange några fält och skriver endast

Material { }
tolkar VRML-bläddraren detta som
Material {
ambientIntensity 0.2 exposedField SFFloat
diffuseColor 0.8 0.8 0.8 exposedField SFColor
emissiveColor 0 0 0 exposedField SFColor
shininess 0.2 exposedField SFFloat
specularColor 0 0 0 exposedField SFColor
transparency 0 exposedField SFFloat
}
Material { } -noden har alltså sex olika fält med normalvärden enligt ovan. Dessa fältvärden kommer att göra ett objekt ljusgrått ( diffuseColor 0.8 0.8 0.8 ) och icke genomskinligt ( transparency 0 ). Material { } -nodens olika fält för att ljussätta, färglägga och kontrollera reflektioner går vi inte närmare in på just nu. Ovan i normal stil finns också angivet vilken typ av fältvärde det rör sig om.

Låt oss nu välja Transform { } -noden för ytterligare en närstudie av en nods syntax. Denna ser ut enligt:

Transform {
children [ ] exposedField MFNode
center 0 0 0 exposedField SFVec3f
translation 0 0 0 exposedField SFVec3f
rotation 0 0 1 0 exposedField SFRotation
scale 1 1 1 exposedField SFVec3f
scaleOrientation 0 0 1 0 exposedField SFRotation
bboxCenter 0 0 0 field SFVec3f
bboxSize -1 -1 -1 field SFVec3f
addChildren eventIn MFNode
removeChildren eventIn MFNode
}
Fältvärdet hos children är en lista bestående av valfritt antal noder. Typiska noder i denna lista är Shape { } -noder, Group { } -noder och andra Transform { } -noder. De nästföljande fälten används för placering och skalning av objekt. Fälten bboxCenter och bboxSize diskuteras i avsnitten om optimering. addChildren och removeChildren antyder att man i efterhand i children -fältet kan lägga till eller plocka bort enstaka noder. Mer om detta längre fram.

Gruppering av noder

När man bygger VRML-världar är det ofta önskvärt att kunna gruppera objekt. Vare sig man bygger ett hus, en bil, eller ett bord kommer man att använda flera delobjekt (väggar och tak, kaross och hjul, bordsskiva och bordsben) som man vill sammanfoga. Om man sätter ihop delobjekten i en grupp kan man enkelt flytta hela gruppen och man kan också genom att namnge gruppen enkelt använda gruppen igen utan att behöva skriva den ibland mycket långa koden igen.

De två vanligaste sätten att gruppera noder är med Group { } -noden och med Transform { } -noden. Med den senare kan man dessutom både skala om och välja rumsplacering. Anchor { } -, Billboard { } - och Collision { } -noden kan också användas för att gruppera objekt.

Ett exempel med Group { } -noden för att bygga en pall:

#VRML V2.0 utf8
DEF Pall Group { #En pall
children [
Shape { #Sittyta
appearance DEF PallMaterial Appearance {
material Material {
emissiveColor 0 0 1
diffuseColor 0 0 1
}
}
geometry Cylinder {
radius 0.3
height 0.04
}
}
Transform { #Placering av Ben
translation 0.26 -0.27 0
children DEF Ben Shape { #Pallben
appearance USE PallMaterial
geometry Cylinder{
radius 0.02
height 0.5
top FALSE
}
}
}
Transform {
translation -0.26 -0.27 0
children USE Ben
}
Transform {
translation 0 -0.27 0.26
children USE Ben
}
Transform {
translation 0 -0.27 -0.26
children USE Ben
}
]
}
Exempel 3. En blå palls olika beståndsdelar grupperade i en enda nod.
I Exempel 3 är pallens fem olika delar (sittytan och de fyra benen) grupperade i en Group { } -nod under namnet "Pall". Först bygger vi sittytan. Här definierar vi pallens material under namnet "Pallmaterial" för att sedan använda en instans av "Pallmaterial" när vi bygger pallbenet. Detta kallar vi "Ben" och återanvänder för att placera ut ytterligare tre gånger med hjälp av Transform { } -noden.

Nästa sida

© 1998 Glenn Sundberg. Alla rättigheter reserverade.