Finora si sono prese in considerazione geometrie molto
semplici, in particolare primitive disponibili quali: sfera,
cono, cilindro, box e text.
Nella maggior parte dei casi, però, modellizzare un
oggetto del mondo reale utilizzando semplici sfere, cilindri,
parallelepipedi ecc. è un’impresa assai difficile e
dai dubbi risultati. Per creare oggetti più complessi
è necessario definire i poligoni che ne costituiscono la
forma. Tale operazione, se fatta a mano, può essere molto
laboriosa e complicata; basti considerare che oggetti anche non
eccessivamente complicati possono facilmente contenere migliaia
di poligoni. In tali casi risulta evidente la
“necessità” di impiegare un tool di sviluppo
3D (ad esempio 3DstudioMax) per poi convertire il file in formato
vrml. Nel nostro caso, per illustrare il procedimento utile alla
realizzazione di figure non primitive direttamente in VRML, si
affronterà la realizzazione di oggetti poligonali
semplici.
I seguenti esempi mostrano come utilizzare i nodi
IndexedLineSet e IndexedfaceSet .
Il nodo IndexedLineSet
Il seguente listato consente di disegnare le linee di un
quadrato vuoto:
#VRML V2.0 utf8
# quadrato outline: uso del nodo IndexedLineSet
Shape {
appearance Appearance {
material Material { emissiveColor 1 .5 0 }
}
geometry IndexedLineSet {
coord Coordinate {
point [ 0 0 0, 0 2.5 0, 2.5 2.5 0, 2.5 0 0, 0 0 0]
}
coordIndex [ 0 1 2 3 0 ]
}
}
Come si nota il nodo IndexedLineSet contiene due campi, il
campo coord e il campo coordIndex. Il primo di essi descrive le
coordinate dei punti di costruzione del perimetro lungo gli assi
xyz. Il secondo indica il numero di vertici che compongono la
figura.
Il nodo IndexedfaceSet
Il secondo listato che prenderemo in esame fa uso del nodo
IndexedfaceSet, grazie ad esso si realizzerà una
piramide:
#VRML V2.0 utf8
# piramide: uso del nodo IndexedfaceSet
Shape {
appearance Appearance {
material Material { emissiveColor .8 0.2 0 }
}
geometry IndexedfaceSet {
coord Coordinate {
point [
-1 0 1, 1 0 1, 1 0 -1, -1 0 -1, 0 1 0
]
}
coordIndex [
0, 3, 2, 1, -1
0, 1, 4, -1
1, 2, 4, -1
2, 3, 4, -1
3, 0, 4, -1
]
}
}
Come si può vedere i campi del nodo IndexedfaceSet sono
gli stessi dell’esempio precedente e lavorano nello stesso
modo.
In pratica: nel campo coord si sono indicate le coordinate dei
quattro punti che costituiscono i vertici del quadrato di base
più le coordinate del punto che costituisce l’apice
della piramide. Si noti che questi punti possono essere
individuati con un numero assegnato in base alla posizione che
occupano nella lista: la prima tripletta sarà individuata
dal numero 0, la seconda dall’ 1, e così via.
Definiti i vertici, si è proceduto ad indicare quali
sono le facce che costituiscono l'oggetto. Nel campo coordIndex,
infatti, si è descritta la sequenza di costruzione delle
varie facce componenti la piramide: prima la base quadrata, poi
le singole facce triangolari. Per fare ciò si è
utilizzata l’indicizzazione numerica sopra descritta: la
costruzione del quadrato di base, per esempio, si realizza unendo
i punti descritti dalla prima tripletta (individuata dal numero
0), dalla terza (3), dalla seconda (2) e dalla prima (1), per
concludere con il numero
-1 che indica la chiusura di una faccia del poligono.
L'ordine con cui si riportano i vertici non è casuale,
ed è anzi essenziale per la corretta visualizzazione
dell’oggetto. I vertici di una faccia vanno riportati in
modo tale che ogni faccia visibile abbia i vertici listati
seguendo il senso antiorario. Diversamenete la faccia non
verrà visualizzata. Ciò deriva dal fatto che tale
genere di meccanismo consente al browser di non doversi
preoccupare delle facce non visibili e quindi di non dover
procedere al loro rendering, a tutto vantaggio della
velocità di resa della scena.