Con i comandi DEF, USE e PROTO il programmatore VRML puo'
creare e utilizzare nuovi nodi, diversi da quelli previsti dalla specifica.
Con il comando USE il nuovo nodo creato (o il gruppo di nodi) può essere
riutilizzato tale e quale nei punti in cui viene invocato. Con il comando PROTO
è possibile invece definire un nuovo nodo il quale avra' dei campi i cui valori
saranno di volta in volta settati dal programmatore. In pratica, con USE
semplicemente si "clona", per così dire, un nodo, mentre con il comando PROTO
si utilizza un prototipo di un nodo che può subire delle modifiche specifiche.
Questo capitolo tratterà in particolare dei comandi DEF e USE.
In un prossimo capitolo si analizzerà il comando PROTO.
Definizione di un nuovo nodo
L'impiego del comando USE, prevede in primo luogo la realizzazione di
un nuovo nodo generalmente costituito da una figura geometrica più o meno complessa
(una casa ad esempio). Affinché questo oggetto diventi disponibile come nodo,
occorre definirlo con un nome, utilizzando il comando DEF. Il comando
DEF ha la funzione di definire in maniera univoca un nodo. Continuando con il
nostro esempio, possiamo quindi definire il nuovo nodo con il nome "Casa"
e poi realizzare normalmente l'oggetto come nella porzione di codice che segue:
[...]
# definizione del nodo Casa
DEF Casa
# creazione del corpo principale della Casa
Shape {
appearance Appearance {
material Material { emissiveColor 1 .5 0 }
}
geometry Box { size 20 20 20 }
}
transform {
translation 0 10 0
children [
[...]
Una volta terminata la realizzazione del nuovo nodo (nel nostro esempio, la
casa) si può finalmente duplicare tale oggetto con il semplice impiego del comando
USE:
# creazione di un duplicato del nodo
Casa
USE Casa
Come si vede, l'impiego dei nodi DEF e USE
è decisamente semplice. Ne sperimenteremo l'uso con un semplice esempio. L'intento
è di realizzare una casa che possa essere velocemente duplicata.
Ecco il codice completo:
#VRML V2.0 utf8
# esempio di utilizzo del comando USE:
quattro case
# definizione del nodo Casa
DEF Casa
# posizionamento della casa
transform {
translation 10 -4 -140
rotation 0 1 0 -.4
children [
# creazione del corpo principale della Casa
Shape {
appearance Appearance {
material Material { emissiveColor 1 .5 0 }
}
geometry Box { size 20 20 20 }
}
transform {
translation 0 10 0
children [
# creazione del tetto della Casa
Shape {
appearance Appearance {
material Material { emissiveColor .5 .1 .1 }
}
geometry IndexedfaceSet {
coord Coordinate {
point [
-10 0 10, 10 0 10, 10 0 -10, -10 0 -10, 0 10
0
]
}
coordIndex [
0, 3, 2, 1, -1
0, 1, 4, -1
1, 2, 4, -1
2, 3, 4, -1
3, 0, 4, -1
]
}
}
]
}
]
}
# creazione di un duplicato del nodo
Casa
# e suo posizionamento rispetto al
nodo originale
transform {
translation -12 0 30
children [
USE Casa
]
}
# creazione del secondo duplicato del
nodo Casa
# e suo posizionamento rispetto al
nodo originale
transform {
translation -24 0 60
children [
USE Casa
]
}
# creazione del terzo duplicato del
nodo Casa
# e suo posizionamento rispetto al
nodo originale
transform {
translation -36 0 90
children [
USE Casa
]
}
Come detto, l'impiego dei nodi DEF e USE è assai semplice, il
lavoro maggiore consiste in realtà nella costruzione dell'oggetto "Casa"
e nel corretto posizionamento dei suoi cloni all'interno del mondo.
È evidente comunque il vantaggio di un tale modo di procedere sia in termini
di tempo impiegato dal programmatore, sia per quanto riguarda le dimensioni
finali del file.