Un file COLLADA è sostanzialmente un file XML il cui contenuto rispetta le regole descritte nel relativo XML Schema (che, per la versione 1.4, è disponibile sul sito http://www.khronos.org/), e questo ci fornisce l’opportunità di studiare un semplice caso d’uso (il cube.DAE distribuito nel precedente articolo di questa mini guida) per coglierne gli aspetti fondamentali anche utilizzando un comune editor XML (o editor testuale) come strumento di indagine. Abbiamo già discusso dei parametri ambient, diffuse, emission e specular con riferimento ai materiali utilizzati nel modello ed in questa sede ci occuperemo della sezione library_geometries e delle meshes.
<library_geometries>
<geometry id=”geom-cube” name=”cube”>
<mesh>
…
<vertices id=”geom-cube-vertices”>
<input
semantic=”POSITION”
source=”#geom-cube-positions”
/>
</vertices>
<source id=”geom-cube-positions”>
<float_array
id=”geom-cube-positions-array” count=”24″
>
-5 5 -5
-5 -5 -5
5 -5 -5
5 5 -5
-5 -5 5
-5 5 5
5 5 5
5 -5 5
</float_array>
<technique_common>
<accessor
source=”#geom-cube-positions-array”
count=”8″ stride=”3″
>
<param name=”X” type=”float”/>
<param name=”Y” type=”float”/>
<param name=”Z” type=”float”/>
</accessor>
</technique_common>
</source>
La mesh, definita dall’omonimo elemento XML mesh, richiede che siano specificati dei vertici (elemento vertices) identificati da un id (geom-cube-vertices) per poter essere referenziati da parti diverse del documento e letti a partire da una sorgente dati (elemento source) il cui identificatore è geom-cube-positions. Tale sorgente definisce un vettore di 24 valori float (count=”24″), la cui semantica di accesso (elemento accessor) specifica che si tratta di 8 gruppi (count=”8″) di 3 elementi ciascuno (stride=”3″), interpretabili come terne (X,Y,Z). Avremo quindi 8 vertici, numerati da 0 a 7, così definiti (ricordiamo inoltre che la sezione asset indicava il cm come unità di misura): (-5,5,-5), (-5,-5,-5), (5,-5,-5), (5,5,-5), (-5,-5,5), (-5,5,5), (5,5,5) e (5,-5,5).
<library_geometries>
<geometry id=”geom-cube” name=”cube”>
<mesh>
…
<source id=”geom-cube-normals”>
<float_array
id=”geom-cube-normals-array” count=”18″
>
0 0 -1
0 0 1
-1 0 0
0 1 0
1 0 0
0 -1 0
</float_array>
<technique_common>
<accessor
source=”#geom-cube-normals-array”
count=”6″ stride=”3″
>
<param name=”X” type=”float”/>
<param name=”Y” type=”float”/>
<param name=”Z” type=”float”/>
</accessor>
</technique_common>
</source>
Le normali alle superfici sono descritte utilizzando una tecnica simile a quella vista per i vertici; riconosciamo quindi 6 diverse normali identificate da un id (geom-cube-normals) e numerate da 0 a 5: (0,0,-1), (0,0,1), (-1,0,0), (0,1,0), (1,0,0), (0,-1,0).
<library_geometries>
<geometry id=”geom-cube” name=”cube”>
<mesh>
…
<triangles material=”r” count=”4″>
<input
semantic=”VERTEX”
source=”#geom-cube-vertices” offset=”0″
/>
<input
semantic=”NORMAL”
source=”#geom-cube-normals” offset=”1″
/>
<input
semantic=”TEXCOORD”
source=”#geom-cube-map1″ offset=”2″ set=”0″
/>
<p>
2 0 2 1 0 1 0 0 0
0 0 0 3 0 3 2 0 2
6 1 2 5 1 1 4 1 0
4 1 0 7 1 3 6 1 2
</p>
</triangles>
Nel cubo di esempio esistono due facce con materiale rosso (material=”r” si riferisce al nome del materiale indicato nella sezione library_materials), ciascuna delle quali suddivisa in due triangoli (la riduzione in triangoli è spesso fatta automaticamente durante l’esportazione di un oggetto dal software 3D usato nello sviluppo, perché questo semplifica la gestione al software di rendering usato nella produzione finale). Nel complesso avremo quindi 4 triangoli di tale materiale per ciascuno dei quali dovremo specificare 3 sequenze composte da un vertice, una normale ed una posizione sulla eventuale texture applicata (di cui non parleremo in questa sede) per un totale di 9 elementi. La riga:
2 0 2 1 0 1 0 0 0
deve quindi essere interpretata come:
V(2) N(0) M(2) V(1) N(0) M(1) V(0) N(0) M(0)
essendo V, N ed M rispettivamente i vettori dei vertici, delle normali e delle posizioni sulla texture definiti in precedenza.
Il triangolo è un poligono complanare ed il concetto di normale è ovvio. Ma come mai il modello COLLADA (ed ogni altro modello proprietario) associa le normali ai vertici e non alla superficie (il triangolo)? E come può, anche dal punto di vista geometrico, un vertice avere una normale? Geometricamente parlando, ovviamente non può: la normale è graficamente associata al vertice per permettere il rendering dell’oggetto in modo tale che la transizione tra diversi triangoli risulti meno brusca ed i vertici meno evidenti. Ricalcolando opportunamente le normali dei vertici (tecnica indicata con il nome di Smooth Shading e di cui esistono più varianti implementative) infatti, non saranno necessari infiniti poligoni perché il modello di una sfera sia visualizzato in modo tale da sembrare proprio una sfera liscia e non sfaccettata.



Aprile 19, 2012
Mondi Virtuali