X3D kogebogen
Introduktion
redigérX3D står for Extensible 3D og er et åbent fil-format, der gør det muligt ,at vise og kommunikere 3D scener og objekter ved hjælp af XML.
Det er en ISO standard, der giver mulighed for, at opbevare og vise grafisk indhold i real-tid.
X3D er en videreudvkling af Virtual Reality Modeling Language (VRML).
Til at vise x3d filer skal man bruge en speciel browser eller et plug-in til sin eksisterende web-browser, kan denne side fortælle om man allerede har en browser eller et plug-in, på siden finder der også links til at downloade: http://cic.nist.gov/vrml/vbdetect.html
Jeg bruger selv Flux-player, som kan downloades her: http://www.mediamachines.com/developer.php
X3D filer gemmes med filendelsen: .x3d
Indledning
redigérEn af fordelene ved X3D er, at det er relativt enkelt, at skabe komplicerede 3D objekter ved hjælp af en simpel tekst-editor som f.eks. Notepad.
Grundlæggende
redigérHUSK der skrives på engelsk facon, så komma skrives som et punktum. Altså bliver 0,5 til 0.5
Størrelse
redigérAlle mål i x3d er i meter. Dette gør det enkelt, at sætte figurer sammen, selvom de er lavet af forskellige personer.
Placering
redigérDa det handler om 3-D opererer man i et XYZ-koordinatsystem. Dette gælder for såvel placering i rummet, men naturligvis også for opbygningen af figurer.
Systemet ser således ud:
I forbindelse med placeringen af figurer, skal man være opmærksom på, at placeringen tager udgangspunkt i midten af figuren og at den første figurs midte er 0-punktet, som de øvrige figurer bliver placeret i forhold til.
Alle vinkler er angivet i radianer.
Omregningen sker således: grader*(pi/180) eller en lille tabel med et par almindelige:
Omregningstabel
Grader | 0° | 30° | 45° | 60° | 90° | 180° | 225° | 270° | 315° | 360° |
---|---|---|---|---|---|---|---|---|---|---|
Radianer | 0 | 0,52 | 0,78 | 1,05 | 1,57 | 3,14 (pi) | 3,93 | 4,71 | 5,5 | 6,28 (2*pi) |
Farver
redigérFarver angives i RGB dvs 3 tal et for hver farvekanal udtrykt som en værdi mellem 0 og 1.
Filopbygning
redigérEn fil består af et antal start-tags, et antal noder (Nodes), der udgør selve figuren og et antal slut-tags.
Formen på en node er typisk:
<Nodenavn parameter1=' ' parameter2=' '>
Bemærk at parametrene er omsluttet af '. Hvis parametren angives med et ord, sættes dette i " ", hvis det er tal gør man ikke dette.
Det er værd at bemærke, at x3d er opbygget på samme måde som xml. Dvs. at det er vigtigt, at der er en slut-tag på enhver tag eller, hvis der ikke findes en slut-tag, at start-tag'en afsluttes med "/" (slash). Endvidere er x3d case-sensitive, så det er vigtigt, at skrive koden helt rigtigt.
Type erklæring
redigérPå den allerførste linje i enhvner x3d fil indsættes dette:
<?xml version="1.0" encoding="UTF-8"?>
Og derefter:
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
Derefter starter selve x3d filen med et start tag:
<X3D>
</X3D>
Header
redigérSå kommer der en head sektion, der kan indeholde forskellige meta-tags:
<head>
</head>
Scene
redigérHerefter starter en scene sektion, hvor den egentlige kode skrives:
<Scene>
</Scene>
En grundfil ser derfor således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> </Scene> </X3D>
Faste noder
redigérTypisk vil man fast tilføje 3 ting mere til en scene: World info, Viewpoint og Navigation info.
Det første handler om grundlæggende informationer om scenen og har ingen betydning for hvordan scenen iøvrigt ser ud.
Det andet handler om ens foruddefinerede positioner i scenen. Det første viewpoint er der hvor man starter. Det er smart fordi man kan give brugeren mulighed for, at se de ting man selv finder interessante.
Det tredje handler om, hvordan man oplever scenen når man bevæger sig rundt i den, såsom størrelsen på ens Avatar. Navigation info fortæller "playeren" hvordan man ser verdenen, når man åbner filen.
World info
redigérMan starter med World info, der kan 2 have værdier:
- Info. Som typisk indeholder en kort beskrivelse af filen. Evt copyright information.
- Title. Her skriver man simpelthen titlen på verden, der så vil blive vist i titellinjen på playeren. Ligesom det kendes fra HTML.
Navigation info
redigérHerefter kommer Navigation info, der kan indeholde følgende:
Node | Parameter |
avatarsize | Radius på en cirkel, fra midten af avataren, til den stoppes af en fast genstand |
Synshøjde over gulvplan. Reelt den maksimale højde på avataren. Eks. den laveste dør avataren kan komme igennem. | |
Knæhøjde over gulvplan, dvs den højde en genstand kan have for at avataren kan gå henover den. Eks. trappetrin. | |
headlight | TRUE / FALSE. Angiver om avataren så at sige har en pandelampe på eller ej. |
speed | Angiver den hastighed som avataren bevæger sig med i en scene, angivet i m/s. Kan ikke antage en negativ værdi. |
transitionTime | Angiver den tid, i sekunder, der går når man skifter fra et viewpoint til et andet. |
transitionType | Angiver måden, man som bruger oplever et skift fra et viewpoint til et andet. |
TELEPORT betyder, at man bliver flyttet uden synlige effekter. transitionTime har ingen effekt her. | |
LINEAR betyder, at flytningen tager den tid, der angivet under transitionTime. | |
ANIMATE betyder, at man oplever at blive flyttet afhængig af playerens indstillinger. | |
type | Angiver hvordan man oplever objekterne i scenen. |
ANY betyder, at det er op til playeren at sætte metoden. | |
WALK avataren bevæger sig rundt, som et menneske der går. Godt til bygninger og byrum. | |
EXAMINE objektet bliver roteret om alle akser, mens avataren står stille. Godt til ting eks. en vase. | |
FLY avataren bevæger sig som en flyvemaskine. Godt til landskaber oversigt over større flader. | |
LOOKAT | |
NONE avataren kan ikke flyttes ved egen kraft, kun ved hjælp af udløste hændelser i rummet. | |
visibilityLimit | Afstanden man kan se i rummet udtrykt i meter. |
En NavigationInfo node, kan så se således ud:
<NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/>
Viewpoint
redigérViewpoint'et angiver som sagt foruddefinerede punkter hvor avataren placeres. Man kan sige, at der er 2 typer Viewpoint: Det første og alle de andre. Det første er en god ide i alle filer, de øvrige må afhænge af flere ting, bl.a. størrelsen på ens scene og om der er ting, man som bruger i særlig grad skal lægge mærke til.
Viewpoint noden tager 3 parametre:
- fieldOfView, som er synsvinklen, den kan antage værdier mellem 0 og pi (altså mellem 0° og 180°)
- orientation, som angive hvad vej, avataren vender, værdien er opbygget således: x y z G (x y z angiver hvilken akse der roteres om og er et enten
0 eller 1, G angiver hvor mange radianer der skal roteres og kan dermed antage et tal mellem 0 og 2*pi)
- position, som angiver hvor i scenen man er placeret ad henholds x, y og z-aksen angive i meter fra 0-punktet. Det er en god at have afstand til de ting
man laver.
Det sidste man kan lægge ind er en baggrund. Det kan være en god ide, fordi det gør det nemmere, at se hvad man har lavet. Jeg vil komme tilbage til, hvordan man laver en baggrund, men denne her ser godt ud, så den bruger vi i det følgende:
<Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/>
Grundfilen ser nu således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> </Scene> </X3D>
Herefter er man klar til, at fylde ting ind på scenen:
Grundlæggende former (Shape's)
redigérDet skal her bemærkes, at man ikke behøver, at indsætte alle parametre, da disse så bare vil bliver tildelt default-værdier.
Disse er:
- Størrelse: 2 meter.
- Solid = TRUE
Den sidste er specielt vigtig, idet man faktisk kun skal indsætte parametrene hvis de er anderledes end default-værdierne.
Endvidere skal man passe på med, at sætte den parameter, der hedder SOLID til FALSE, idet man da ofte slet ikke kan se objektet.
Kasse
redigérKassen hedder Box og tager 1 parameter: size. Der består af 3 værdier: bredde, højde, dybde (eller XYZ). Meter pr akse.
En kasse kan derfor skrives således:
<Box size='1.0 2.5 4.2'/>
En fil med en kasse, kan derfor se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Box size='1.0 2.5 4.2'/> </Shape> </Scene> </X3D>
Cylinder
redigérCylinderen hedder Cylinder og har 6 parametre
Tag | Værdier | Beskrivelse |
bottom | TRUE / FALSE | Angiver om man skal kunne se bunden af cylinderen eller ej. |
height | et tal, der angiver højden i meter | |
radius | et tal, der angiver radius på cylinderen i meter | |
side | TRUE / FALSE | Angiver om man skal kunne se siden af cylinderen, når man er placeret inden i den. |
solid | TRUE / FALSE | Angiver om cylinderen, er hul eller massiv. |
top | TRUE / FALSE | Angiver om man skal kunne se toppen af cylinderen eller ej. |
En cylinder kan derfor skrives således:
<Cylinder height='2.5' radius='0.5' solid='"FALSE"' top='"FALSE"'/>
En fil med en cylinder, kan der se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Cylinder height='2.5' radius='0.5' top='"FALSE"'/> </Shape> </Scene> </X3D>
Kegle
redigérKeglen hedder en cone og har 5 parametre
Tag | Værdier | Beskrivelse |
bottom | TRUE / FALSE | Angiver om man skal kunne se bunden af cylinderen eller ej. |
bottomRadius | et tal, der angiver radius på bunden af keglen i meter | |
height | et tal, der angiver højden i meter | |
side | TRUE / FALSE | Angiver om man skal kunne se siden af keglen, når man er placeret inden i den. |
solid | TRUE / FALSE | Angiver om keglen, er hul eller massiv. |
En kegle kan derfor skrives således:
<Cone height='2.5' bottomRadius='0.5'/>
En fil med en kegle, kan der se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Cone height='2.5' bottomRadius='0.5'/> </Shape> </Scene> </X3D>
Kugle
redigérKuglen hedder en sphere og har 2 parametre
radius, som er et tal, der angiver radius på kuglen i meter og solid, der angiver om kuglen, er hul eller massiv (skrives som TRUE eller FALSE).
En kugle skrives derfor således:
<Sphere radius='0.5' solid='"FALSE"'/>
Således kunne en fil, med en kegle, derfor skrives sådan her:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Sphere radius='0.5' solid='"FALSE"'/> </Shape> </Scene> </X3D>
Udseende
redigérUdseende på et objekt specificeres ved en Appearance node, der kan indeholde følgende noder:
- Material-node der fortæller noget om farver på objekter
- Texture-noden der "klistrer" et billede på et objekt.
Material noden kan indeholde følgende:
Node | Tag's | Værdier | Beskrivelse |
material | |||
diffuseColor | angives ved 3 RGB-værdier | en mat farve-flade, der reflekterer lys afhængigt af avatarens vinkel i forhold til lyskilden. | |
emissiveColor | angives ved 3 RGB-værdier | farve-fladen afgiver eget lys, dvs. der behøves ingen lyskilde for, at man kan se den. | |
shininess | angives med en værdi mellem 0 og 1 | fortæller noget om fladens evne til at reflektere lys. | |
transparency | angives med en værdi mellem 0 og 1 | angiver fladens transparens. Værdien 1 giver fuldstændig gennemsigtighed, 0 ingen gennemsigtighed. |
Så en material node i en Appearance node, kan se således ud:
<Appearance> <material diffuseColor='0.2 0.5 0.8' transparency='0.5'/> </Appearance>
En fil med en material node kunne se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Appearance> <Material diffuseColor='0.2 0.5 0.8' transparency='0.5'/> </Appearance> <Sphere radius='0.5' solid='"FALSE"'/> </Shape> </Scene> </X3D>
Så nu ser kuglen fra før således ud:
Texture-noden angiver hvordan man sætter et billede på et objekt. Billedet kan være af typerne: JPEG, PNG eller GIF. Måske understøtter playeren andre formater, men dette er ikke sikkert.
Node | Tag's | Værdier | Beskrivelse |
texture | |||
url | Angiver en sti til det billede der skal anvendes | ||
repeatS | TRUE eller FALSE | Angiver hvorvidt billedet skal kopieres ad X-aksen eller ej. Dvs. hvis værdien er sat til TRUE, bliver kopieret udad X-aksen, så det fylder hele fladen.
ellers vises billedet kun 1 gang. | |
repeatT | TRUE eller FALSE | Angiver hvorvidt billedet skal kopieres ad Y-aksen eller ej. Dvs. hvis værdien er sat til TRUE, bliver kopieret opad Y-aksen, så det fylder hele fladen.
ellers vises billedet kun 1 gang. |
Så en texture node i en Appearance node, kan se således ud:
<Appearance> <texture url='Brenda.jpg repeatS='"TRUE"' repeatT='"FALSE"'/> </Appearance>
En fil med en texture node kunne se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Background groundAngle='1.309 1.571' groundColor='0.1 0.1 0 0.4 0.25 0.2 0.6 0.6 0.6' skyAngle='1.309 1.571' skyColor='0 0.2 0.7 0 0.5 1 1 1 1'/> <Shape> <Appearance> <ImageTexture url='"Brenda.jpg"' repeatS='"TRUE"' repeatT='"FALSE"'/> </Appearance> <Box size='1.0 2.5 4.2'/> </Shape> </Scene>
</X3D>
Denne kasse kommer så til, at se således ud:
Genbrug
redigérDet er grundlæggende 2 forskellige måder, at genbruge sine Shapes på, enten ved, at man i samme fil bruger en eller flere shapes igen, eller at man i en fil indsætter en anden fil.
Fordelen er naturligvis, at man slipper for at lave de samme shapes flere gange.
DEF/USE
redigérNår man i den samme fil, genbruger sine Shapes, indsætter man i den Shape, man senere ønsker at genbruge, det reserverede ord:DEF og derefter et passende navn. Det kan se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Group> <Shape DEF='Kugle'> <Appearance> <Material diffuseColor='0.2 0.5 0.8' transparency='0.5'/> </Appearance> <Sphere radius='0.5'/> </Shape> <Transform translation='1 0 0'> <Shape USE='Kugle'/> </Transform> </Group> </Scene> </X3D>
Den Transform-node der er brugt forklares nedenunder, men den bruges i det her tilfælde til, at flytte den anden kugle lidt i forhold til den første, det ser således ud i browseren:
Inline
redigérDen anden metode hedder Inline, her indsætter man et link til den fil, man ønsker at sætte ind. Det virker sådane her:
<Inline url='"kasse.x3d"'>
Transformering
redigérNår man genbruger sine shapes, er det ofte nødvendigt, at ændre på udseendet eller placeringen af de efterfølgende shapes. Til dette bruger man en Transform-node, der giver mulighed for, at skalere, rotere og flytte sine shapes. Transform-noden bruges også til, at flytte shapes man ikke har genbrugt.
Noden ser således ud:
<Transform> </Transform>
Skalering
redigérMan kan indsætte et skalerings-tag, som ændrer på størrelsen på en node.
Skaleringen udføres på de 3 akser: X Y Z. Værdien der tildeles angiver med hvilken faktor størrelsen ændres, dvs. hvis faktoren er 2 fordobles størrelsen, hvis faktoren er 0.5 halveres størrelsen. Her er lavet en skalering, der fordobler alle 3 sider:
<Transform scale='2.0 2.0 2.0'> <Shape> </Transform>
Rotation
redigérMan kan indsætte et roterings-tag, som ændrer på hvordan en node vender.
Rotationen foregår omkring X Y Z akserne. Og er opbygget således: X Y Z G. Dvs. X Y Z angiver om hvilken akse der skal roteres og antager værdien 0 eller 1, G angiver hvor mange radianer man roterer.
Der er en simpel måde at gøre det på og en kompliceret måde, at gøre det på.
Den simple måde er hvor man kun roterer om den ene af akserne, f.eks. 0 1 0 1.57.
Den komplicerede måde er, hvor man roterer om flere akser, f.eks. 0.2 0.45 0.32 1.45. Hvad hver enkelt værdi skal være, kan jeg ikke give et svar på. Men der findes et lille program, der kan gøre det for en, det hedder VT Dizzy 1.1 og kan hentes her: http://www.softpedia.com/get/Science-CAD/VT-Dizzy.shtml
Her ses hvordan en simpelt rotation ser ud, der bliver drejet 90° om Y-aksen:
<Transform rotation='0 1 0 1.57'> <Shape> </Transform>
Positionering
redigérPositionerings tag'et hedder translation i x3d "sprog" Man kan indsætte et translation-tag, som ændrer på hvor en node placeres i scenen. Dette bruges ofte (altid), da efterfølgende noder placeres i forhold til den første node.
Hvis man sætter et translation-tag på den første shape, skal man være opmærksom på det forhold, når man flytter på de andre shapes, derfor vil man normalt udelade translation på den første (eller eneste) form.
Postionering udføres på de 3 akser: X Y Z. Værdien der tildeles angiver hvilken afstand fra nulpunktet den nye position er.
Et translation-tag altså se sådan her ud:
<Transform translation='0.8725 3.5 4'> <Shape> </Transform>
En transform node med alle tags indlagt, kan se således ud:
<Transform scale='0.5 2 1.5' rotation='0 1 0 1.57' translation='0.8725 3.5 4'> <Shape> </Transform>
Tag'et skalerer objektet 0,5 på x-aksen, 2,0 på y-aksen og 1,5 på z-aksen. Derefter roteres objektet 90° om y-aksen og endelig flyttes objektet 87,25 centimeter ad x-aksen 3,5 meter ad y-aksen og 4 meter ad z-aksen.
En fil kunne så se således ud:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <head> </head> <Scene> <WorldInfo info='"(c) Copyright bla bla bla"' title='"Grundscene"'/> <NavigationInfo avatarsize='0.3 1.9 0.6' headlight='true' type='"WALK"' transitiontype='"LINEAR"'/> <Transform scale='0.5 2 1.5' rotation='0 1 0 1.57' translation='0.8725 3.5 4'> Et objekt her </Transform> </Scene> </X3D>
Eksterne henvisninger
redigérhttp://www.web3d.org/x3d/content/examples/Vrml2.0Sourcebook/