Texturing di un Triangolo, Teoria e Applicazione
Cristian Merighi ()

Soluzione teorica al problema - tipico degli engine 3D - della tessitura in coordinate UV su di una forma triangolare. Applicazione dimostrativa in ambiente Silverlight.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.
Questo articolo intende mostrare come si risolve il problema della mappatura di una tessitura in coordinate UV su facce triangolari
in un ambiente 3D.
Le cosiddette mesh, altro non sono infatti che un insieme strutturato di triangoli che approssimano una data geometria solida reale.
Le rappresentazioni testuali, leggibili della struttura di una mesh (vedi VRML, OBJ, X3D, WPF XAML...) solitamente prevedono:
- nodi: elenco ordinato di punti tridimensionali (x, y, z);
- facce: consistono in una serie di triplette di indici riferiti ai vari nodi in elenco che costituiscono i vari triangoli;
- normali: i vettori tridimensionali normali nei vertici di ogni triangolo al piano individuato dal triangolo stesso;
- coordinate di tessitura: le coordinate UV (punti ∈ [0,1]2) individuati per nodo e per faccia.
Ecco, si parla proprio di queste ultime nel presente articolo!
Allora, come si applica una immagine ad un triangolo date le coordinate UV per ogni vertice (problema ultimo)?
In ambiente Silverlight, dobbiamo preoccuparci di trasformare coerentemente il riempimento della nostra shape triangolare.
In maniera predefinita, esso è allineato ed occupa in toto il bounding box del triangolo
deformandosi in larghezza ed altezza secondo le necessità.
Nota bene: questo articolo intende offrire un approccio teorico al problema, è però strettamente connesso alla tecnologia
Silverlight per quanto riguarda le applicazioni pratiche.
Il nocciolo del problema è quello di ottenere quella trasformazione che rimappa le coordinate bidimensionali dei tre punti sullo schermo
sulle rispettive coordinate UV.
Esso si risolve nella soluzione di un sistema algebrico linare di 6 equazioni in 6 incognite,
infatti dobbiamo ottenere i coefficienti della matrice affine 3x3 che consente la seguente trasformazione:
Dove:
- u1 (∈ [0,1]) è la coordinata U nel sistema di riferimento UV del primo vertice (A);
- v1 (∈ [0,1]) è la coordinata V nel sistema di riferimento UV del primo vertice (A);
- ξ1 (∈ [0,1]) è la coordinata x normalizzata (lungo la larghezza del bounding box del triangolo) del primo vertice (A);
- η1 (∈ [0,1]) è la coordinata y normalizzata (lungo la altezza del bounding box del triangolo) del primo vertice (A);
Lo stesso risultato, utilizzando la stessa matrice, dobbiamo ottenerlo per i vertici 2 (B) e 3 (C).
Per cui, combinando le tre condizioni, abbiamo il sistema in 6 equazioni e 6 incognite (m11, m12, m21, m22, offsetx, offsety)
anticipato precedentemente:
La soluzione del sistema si ottiene sfruttando per via computazionale la
regola di Cramer.
I sei valori ottenuti popolano quindi la matrice di trasformazione del riempimento
(proprietà RelativeTransform del nostro oggetto ImageBrush) del nostro triangolo in ambiente Silverlight!
Potete testare voi stessi la correttezza del risultato ottenuto interagendo con la seguente applicazione dimostrativa (Silverlight 2 Beta 2):
Questo articolo è stato scritto, come già detto, a mo' d'introduzione teorica al problema del mesh texturing.
Per il codice e le applicazioni "serie", beh, si tratta di aspettare un paio di giorni il mio prossimo articolo: in esso
mostrerò le funzionalità di mesh texturing integrate con il resto dell'engine 3D per Silverlight già introdotto su questo blog.
Take care. Bye.