Politecnico di Milano - Facoltà del design

Appunti di VRML per gli studenti del laboratorio di computer grafica C2
Parte 1: concetti generali, primitive

© Prof. Giovanni Gigante - Revisione 1 (28 maggio 2003)


Introduzione

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:

  1. Si creano i singoli oggetti con un modellatore (Maya, Rhinoceros, 3dStudio, ecc.), e li si esporta in VRML
  2. Con un'applicazione apposita (per esempio CosmoWorlds) si edita il mondo VRML, assemblando gli oggetti, stabilendo le eventuali animazioni, ecc.
  3. Se necessario, si interviene manualmente sul codice, alla fine.

Il file VRML

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" ]

}

Lo spazio VRML. Coordinate, misure, colori, angoli

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).

Costruzione di forme semplici ("primitive")

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

Esempi

Selezionare il link per aprire il mondo VRML

Esempio 1: un cubo

Non specificando le dimensioni, si ottiene un cubo 2 x 2 x 2:

#VRML V2.0 utf8
Shape {
geometry Box { }
}

Esempio 2: un parallelepipedo

Qui invece specifichiamo le dimensioni dei tre lati:

#VRML V2.0 utf8
Shape {
geometry Box {
size 1.0 2.0 3.0
}
}

Esempio 3: un cono

#VRML V2.0 utf8
Shape {
geometry Cone {
bottomRadius 1.5
height 3.0
}
}

Esempio 4: un cilindro rosso

#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material { diffuseColor 1.0 0.0 0.0 }
}
geometry Cylinder {
radius 2.0
height 5.0
}
}

Esempio 5: una sfera gialla

#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material { diffuseColor 1.0 1.0 0.0 }
}
geometry Sphere { radius 2.0 }
}