Resumé

Texturing di un Triangolo, Teoria e Applicazione

Cristian Merighi () 4,60

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

triangle and UV coordinates

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:

matrix computation

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:

linear algebraic system

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

textured triangle demo

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.

Feedbacks

  • Re: Triangle Texturing, Theory and Silverlight App

    Martijn Croezen lunedì 30 giugno 2008 5,00

    Nice, Could've used this 2 months ago when I built my own texturemapper. (I'm not that great at Math) I haven't tried RelativeTransform yet, but does that take care of where the matrix starts to draw? I use .Transform myself, but I have to determine the left- and rightmost corner of a triangle first, and then offset the texture correctly. Your example also seems to have a rounding error, when you move 1 vertex of the triangle, you can see the texture 'jump around' a little on the opposite side. check out my version (also includes slight expansion of the triangles to get rid of antialias lines) http://whizzkid74.blogspot.com/2008/06/panoramacube-for-silverlight-2beta2.html

  • Re: Triangle Texturing, Theory and Silverlight App

    martijn croezen lunedì 30 giugno 2008 5,00

    Duh, see I knew I had seen this site before :) AND I've already told you about the panocube hehe, ahwell, at least the link i gave you now has the updated version of the cube in it :) cheers!

  • Re: Triangle Texturing, Theory and Silverlight App

    Mike domenica 3 agosto 2008 5,00

    Hi, when can we expect the source code for this? I am dying to see how its done programmatically. Thanks

  • Re: Triangle Texturing, Theory and Silverlight App

    Quikboy sabato 29 novembre 2008 4,00

    Beautiful Silverlight blog! I love it. It's not even slow!

  • Re: Triangle Texturing, Theory and Silverlight App

    balu lunedì 19 gennaio 2009 4,00

    hi. nice application i was looking for 3D in silverlight. i have one question how can we create 3d models in silverlight. is there any tool for it? regards balu

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds