Politecnico di Milano - Facoltà del design
© Prof. Giovanni Gigante - Revisione 1 (28 maggio 2003)
Il VRML (Virtual Reality Modeling Language) è un linguaggio per la descrizione di scene 3d vettoriali per utilizzo attraverso Internet. La versione correntemente utilizzata è il VRML 97, anche detto VRML 2.0 (standard ISO-IEC). Una versione più moderna è attualmente in preparazione, col nome di X3D, e tra le altre cose avrà una sintassi più simile a quella di HTML e XML (con i tag, ecc.).
Una scena (pagina, modello) in VRML viene detto "mondo" (world). Per visualizzare un mondo VRML nel proprio browser occorre avere installato un apposito componente aggiuntivo (plugin); i più diffusi sono Cosmo Player e il più moderno Cortona.
Per creare un mondo VRML si può naturalmente scrivere il codice a mano, ma questo è impraticabile se si hanno geometrie complesse. La prassi più comune è quindi la seguente:
Il VRML non è tollerante sul piano della sintassi: deve quindi essere scritto in modo totalmente corretto, altrimenti non funziona. In particolare, è sensibile alla differenza tra maiuscole e minuscole.
I file VRML hanno l'estensione .wrl (abbreviazione di "world"),
e devono obbligatoriamente avere nella prima riga questa dichiarazione
iniziale :
#VRML V2.0 utf8
che dichiara la versione utilizzata (2.0) e il set di caratteri impiegato (utf8,
che è una delle codifiche del set di caratteri universale Unicode).
Il simbolo # all'inizio della riga indica che è un commento.
In VRML, quando una riga contiene il simbolo #, tutto ciò
che lo segue è considerato un commento.
Un file VRML è composto da una serie di oggetti chiamati nodi, che descrivono forme, proprietà e così via. Un nodo, in generale, contiene un nome, un paio di parentesi graffe, e al loro interno una serie di campi con i relativi valori. Per esempio:
Box {
size 2.0 2.0 2.0
}
"Box" è il nome del nodo (una scatola, cioè un cubo), "size" è il campo che ne specifica la dimensione, seguito appunto dai tre valori della dimensione.
Si noti che i nomi dei nodi hanno sempre l'iniziale maiuscola,
i nomi dei campi hanno sempre l'iniziale minuscola. Quando
un campo ha un nome formato da due parole, l'iniziale della seconda è
maiuscola (es.: diffuseColor).
Alcuni campi contengono a loro volta altri nodi, come se fossero delle scatole
una dentro l'altra.
In generale, i nodi VRML hanno una grande quantità di campi su cui si
può intervenire; tuttavia, è sufficiente scrivere quelli che interessano,
gli altri assumeranno automaticamente un valore standard (valore di default).
Questa dispensa, in particolare, non cita tutti i campi disponibili, ma solo
i più importanti; per maggiori dettagli occorre consultare un testo sul
VRML oppure la descrizione dello standard.
Nel seguito di questa dispensa, si useranno delle tabelle che descrivono i vari campi, il loro significato, e il loro valore iniziale, del tipo:
| nodo Nomedelnodo | ||
nomedelcampo |
Descrizione del campo | Valore di default (quello che viene assunto se non se ne specifica uno) |
Alcuni campi possono contenere più di un valore. Per esempio, il campo
string del nodo Text può contenere diverse
linee di testo da scrivere. In questo caso, tutti i valori vanno compresi da
parentesi quadre, e separati da virgole:
Text {
string [ "pippo", "pluto", "paperino" ]
}
Per individuare le posizioni, i mondi VRML hanno un sistema di coordinate tridimensionali
(x y z). Normalmente, quando l'utente carica il mondo, si trova nei pressi dell'origine
degli assi (punto 0 0 0); l'asse X è orizzontale, positivo verso destra;
l'asse Y è verticale, positivo verso l'alto; l'asse Z è ortogonale,
positivo in direzione di chi guarda.
Per ricordarselo, si può usare la "regola della mano destra":
tendendo le prime tre dita, il pollice è l'asse X, l'indice è
l'asse Y, il medio (girato verso il viso) è l'asse Z.
Per quanto riguarda le misure, in questo spazio di solito si adopera la convenzione secondo cui una unità equivale a 1 metro. Tuttavia si può anche adottare una convenzione di scala diversa, in particolare se si vogliono rappresentare oggetti molto piccoli o molto grandi.
Il VRML misura gli angoli non in gradi, ma in radianti. Per effettuare la conversione, basta sapere che 180 gradi equivalgono a 3,14 radianti (quindi, per esempio, 90 gradi sono circa 1,57 radianti).
I colori, in VRML, vengono come al solito rappresentati con una terna di valori RGB (rosso verde blu), ma a differenza dell'HTML, ciascuno di questi valori utilizza una scala decimale che va da 0 (nero) a 1 (massima intensità). Così, per esempio, un giallo scuro sarà "0.5 0.5 0".
Fare attenzione che il VRML utilizza la convenzione americana per cui i numeri decimali sono separati dal punto, e non dalla virgola come in Europa (per cui è 0.5 non 0,5).
Le forme in VRML si costruiscono con il nodo Shape (forma):
| nodo Shape | ||
appearance |
Un nodo Appearance che descrive l'aspetto (colore, materiale)
della forma da costruire |
NULL (aspetto standard, bianco) |
geometry |
Un nodo geometrico (p.es. Box, Cone, Cylinder,
Sphere, Text, ecc.) che descrive la forma da costruire |
NULL (nessuna forma) |
Il nodo Appearance serve a descrivere l'aspetto di una forma
| nodo Appearance | ||
material |
Un nodo Material che descrive il materiale di cui è
fatta la forma |
NULL (materiale standard) |
texture |
Texture (motivo di rivestimento esterno) da applicare alla forma (sarà descritto più avanti) | NULL (nessuna texture) |
textureTransform |
(sarà descritto più avanti) | NULL (nessuna) |
Il nodo Material serve a descrivere materiali e colori:
| nodo Material | ||
diffuseColor |
un colore opaco, specificato come una terna RGB (rosso verde blu) | 0.8 0.8 0.8 (grigio chiaro) |
emissiveColor |
un colore che emette luce: come una lanterna cinese, risplende ma non illumina lo spazio circostante. Specificato come una terna RGB (rosso verde blu) | 0.0 0.0 0.0 (non emette luce) |
transparency |
la trasparenza: 0 indica un solido opaco, 1 è un solido trasparente e invisibile. | 0 (opaco) |
Esistono diversi nodi di tipo geometrico. Box costruisce un cubo (centrato sull'origine degli assi):
| nodo Box | ||
size |
Le dimensioni del cubo: tre valori (X Y Z) | 2.0 2.0 2.0 |
Cone costruisce un cono (centrato sull'origine degli assi):
| nodo Cone | ||
bottomRadius |
Raggio di base | 1.0 |
height |
Altezza | 2.0 |
side |
Deve disegnare il lato? | TRUE |
bottom |
Deve disegnare la base? | TRUE |
Cylinder costruisce un cilindro (centrato sull'origine degli assi):
| nodo Cylinder | ||
radius |
Raggio | 1.0 |
height |
Altezza | 2.0 |
side |
Deve disegnare il lato? | TRUE |
top |
Deve disegnare la base superiore? | TRUE |
bottom |
Deve disegnare la base inferiore? | TRUE |
Sphere costruisce una sfera (centrata sull'origine degli assi):
| nodo Sphere | ||
radius |
Raggio | 1.0 |
Selezionare il link per aprire il mondo VRML
Non specificando le dimensioni, si ottiene un cubo 2 x 2 x 2:
#VRML V2.0 utf8
Shape {
geometry Box { }
}
Qui invece specifichiamo le dimensioni dei tre lati:
#VRML V2.0 utf8
Shape {
geometry Box {
size 1.0 2.0 3.0
}
}
#VRML V2.0 utf8
Shape {
geometry Cone {
bottomRadius 1.5
height 3.0
}
}
#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material { diffuseColor 1.0 0.0 0.0 }
}
geometry Cylinder {
radius 2.0
height 5.0
}
}
#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material {
diffuseColor 1.0 1.0 0.0
}
}
geometry Sphere {
radius 2.0
}
}