Breve nota per “tentare” di chiarire un po' di confusione...

9
Breve nota per “tentare” di chiarire un po' di confusione sulle modalità di “mapping” e di proiezione che Blender adotta sulle tessiture. Il sistema che Blender usa per “mappare” una tessitura su una mesh è molto potente e sofisticato. Purtroppo però in certi aspetti è anche un po' confuso e (cough cough) orribilmente documentato. In questi brevi appunti cerco di indicare qualche idea di “base” che potrà giovare ai volenterosi che volessero addentrarsi in questa area. Prima però trov o molto divertente citare cosa si trova scritto nell'attuale documentazione on-line wiki di Blender a tale riguardo, siete dunque avvisati (ma... non esiste niente che non si possa comprendere con sufficiente applicazione!): So, all this is a bit hard to understand and master. Fortunately, you do not have to change these settings often, except for some special effects… Anyway, the only way to get used to them is to practice! (URL: http://wiki.blender.org/index.php/Doc:2.6/Manual/Textures/Mapping ) Lo spazio della tessitura Per Blender una tessitura “vive” in un suo spazio 3d. Il modo migliore per capire questo concetto è immaginare la tessitura come una funzione matematica T(X, Y, Z) definita sul cubo con spigolo di lunghezza 2 e il cui baricentro coincide con l'origine: [-1, 1] x [-1, 1] x [-1, 1] . Per non confonderci troppo con le lettere maiuscole X, Y, Z indichiamo le coordinate in questo “spazio” della tessitura. Primo importante dettaglio... fatto apposta per confonderci! Il sistema di riferimento del mondo delle tessiture NON è come orientato come quello dello spazio 3D. Nel riferimento del mondo delle tessiture X indica sinistra destra, Y indica alto basso e Z indica avanti indietro.

Transcript of Breve nota per “tentare” di chiarire un po' di confusione...

Breve nota per “tentare” di chiarire un po' di confusione sulle modalità di “mapping” e di proiezione che Blender adotta sulle tessiture.

Il sistema che Blender usa per “mappare” una tessitura su una mesh è molto potente e sofisticato. Purtroppo però in certi aspetti è anche un po' confuso e (cough cough) orribilmente documentato.In questi brevi appunti cerco di indicare qualche idea di “base” che potrà giovare ai volenterosi che volessero addentrarsi in questa area.

Prima però trov o molto divertente citare cosa si trova scritto nell'attuale documentazione on-line wiki di Blender a tale riguardo, siete dunque avvisati (ma... non esiste niente che non si possa comprendere con sufficiente applicazione!): “So, all this is a bit hard to understand and master. Fortunately, you do not have to change these settings often, except for some special effects… Anyway, the only way to get used to them is to practice! “ (URL: http://wiki.blender.org/index.php/Doc:2.6/Manual/Textures/Mapping)

Lo spazio della tessituraPer Blender una tessitura “vive” in un suo spazio 3d. Il modo migliore per capire questo concetto è immaginare la tessitura come una funzione matematica T(X, Y, Z) definita sul cubo con spigolo di lunghezza 2 e il cui baricentro coincide con l'origine: [-1, 1] x [-1, 1] x [-1, 1] .

Per non confonderci troppo con le lettere maiuscole X, Y, Z indichiamo le coordinate in questo “spazio” della tessitura.

Primo importante dettaglio... fatto apposta per confonderci!Il sistema di riferimento del mondo delle tessiture NON è come orientato come quello dello spazio 3D. Nel riferimento del mondo delle tessiture X indica sinistra destra, Y indica alto basso e Z indica avanti indietro.

Tutte le tessiture in Blender sono quindi definite in modo “tridimensionale”.Questo è vero anche quando la tessitura è di tipo “immagine” importata da un file esterno. In questo caso il rettangolo della immagine viene trasformato in un quadrato di lato 2 x 2 e ad esso vengono applicate le coordinate X e Y dello spazio delle tessiture mentre la coordinata Z diviene ininfluente, o se preferite, l'immagine viene “replicata” sempre uguale fino a “riempire” la direzione Z.

NOTA: Il passaggio dalla “immagine” al quadrato 2x2 è anche esso un processo che può essere controllato usanod i parametri che appaiono quando si usa una tessitura di tipo immagine nei pannelli “Image mapping” e “Image sampling”. I parametri in questo caso sono tutti molto intuitivi per non rendere questi appunti troppo lunghi si lascia al lettore il compito di studiarne gli effetti autonomamente.

Trasferimento dei valori di una tessitura ai punti di una mesh.Il meccanismo di cui abbiamo bisogno è un metodo che assegni ad ogni punto P della mesh un corrispondente punto Q = ( X(P), Y(P), Z(P)) nello spazio delle tessiture. Chiamiamo la corrispondenza tra punti della mesh e punti nello spazio delle tessiture “mapping” e la indichiamo con la lettera M. Si ha dunque che Q=M(P).Il valore di tessitura che verrà applicato a P sarà quindi T(M(P)) = T(Q).= T (X(P),Y(P),Z(P)).Affinché queste idee diventino “calcoli” dobbiamo specificare:a)il sistema di coordinate che specifica il punto Q nello spazio delle tessiture e questo è stato chiarito nella sezione precedente.b) il sistema di coordinate che specifica il punto P ai fini del mapping.c) la legge matematica che specifica la corrispondenza M, detta anche “proiezione”.

I punti b) e c) verranno coperti di seguito.

Sistema di coordinate da adottare per i punti della mesh ai fini del mappingTrattiamo in questo paragrafo di quali coordinate usare per il punto P di una mesh ai fini del calcolo della corrispondenza tra punti della mesh e punti nel texture space.Per minimizzare la confusione possibile le coordinate di un punto P della mesh saranno indicate con le lettere minuscole P = (x,y,z).Blender offre numerose possibilità per questa scelta ma le più comuni sono:

Global : ogni punto P della mesh ha nel sistema di riferimento globale le sue precise coordinate (xworld, yworld, zworld) . Si assegnano banalmente a P le medesime coordinate: P = (x y z) = (xworld, yworld, zworld)Vantaggio: semplicità.Svantaggio (o opportunità) : se si trasla o ruota la mesh nello spazio del mondo le coordinate assegnate a P per calcolare il trasferimento di tessiture cambiano... e l'aspetto dell'oggetto si modifica di conseguenza.

Object : ogni oggetto presente nella scena ha un sistema di coordinate solidale a se stesso, al quale spesso ci riferiamo con il termine “riferimento locale”. Questo sistema di riferimento è quello che viene utilizzato ogni volta che in “edit mode” modifichiamo la struttura della mesh. Il metodo Object consente di scegliere un oggetto qualunque della scena ead assegna al punto P della mesh le coordinate che esso avrebbe nel sistema di riferimento locale di tale oggetto.Scelta molto comune come “oggetto che presta il riferimento” è un empty. Animare l'empy porterà dunque ad animare la tessitura.Se l'oggetto non viene specificato il riferimebnto adottato è quello della scena e quindi questa tecnica diviene identica alle coordinate Global illustrate sopra.

Generated : con questo strano nome Blender si riferisce al sistema di coordinate che assegna ad un punto P della mesh le coordinate Object ove però l'”object” di riferimento è l'oggetto stesso con cui stiamo lavorando. Questa scelta ha il grandissimo vantaggio di rendere solidale il sistema di coordinate per il calcolo delle tessiture all'oggetto stesso. Se l'oggetto si muove o si riscala le tessiture seguono in maniera solidale l'oggetto in tali trasformazioni garantendo coerenza visuale.Si tratta in pratica di una “abbreviazione” all'uso del sistema Object ove l'object stesso è lo stesso su cui lavoriamo. (sovrabbondanza della GUI!)

UV : si tratta di una tecnica importantissima e flessibilissima che viene usata per specificare in maniera “personalizzabile” le coordinate (x,y,z) da assegnare a ciascun punto della mesh. Essa verrà trattata in una lezione a parte e non viene approfondita in questi appunti.

Blender offre, come accennato sopra, altri sistemi di coordinate. Essi sono di raro utilizzo e non ne parleremo in questi appunti.

Proiezioni: dalla mesh allo spazio della tessitura.Se abbiamo seguito il percorso di questi appunti fino ad adesso dovrebbe essere chiaro che abbiamo due spazi:

1) lo spazio della mesh i cui punti ricevono (con uno dei metodi discussi nella sezione precedente) coordinate (x,y,z);

2) lo spazio della tessitura i cui punti hanno coordinate (X,Y,Z) e a cui la “tessitura” assegna un valore T(X,Y,Z).

In questo paragrafo vogliamo discutere le modalità più comuni di corrispondenza tra (x,y,z) e (X,Y,Z).

Val la pena di ricordare ancora una volta, per proteggersi dalla inevitabile piccola confusione, che i sistemi di riferimento xyz e XYZ NON sono orientati nello stesso modo!!! Pazienza, ciò deriva da

ragioni di “sviluppo storico” degli algoritmi di texture mapping e del software stesso.

Esploriamo le più comuni modalità di proiezione:

Flat: Le equazioni della corrispondenza in questo caso sono molto semplici:M(P) = M(x,y,z) = (X=x,Y=y,Z=z).Come conseguenza il valore di tessitura che viene applicato al punto P è semplicemente T(x,y,z).L'effetto è illustrato nella figura che segue:

Conviene esplorare in questo semplicissimo caso le possibili “variazioni” e difficoltà che saranno poi comuni anche per gli altri metodi di proiezione.

Range delle coordinate: periodicità della tessitura: se i valori delle coordinate x,y,z eccedono il range [-1,1] dello spazio delle feature se ne prende il modulo, ovvero si opera come se la tessitura si ripetesse all'infiino in modo periodico).

Traslazione/offset: M(P) = M(x,y,z) = (x+offsetx, y+offesety, z+offsetz)Scala: M(P) = (sx*x, sy*y, sz*z) ove i fattori di “riscalamento” sx, sy, szpossono essere scelti

dall'utente. I tre effetti si “combinano” in maniera naturale tra loro come indicato nella figura che segue:

Un altro gruppo di opzioni (che confonde non poco anche a causa di una GUI in questo caso davvero oscura) è quello dello “scambio” di posto delle coordinate. Più precisamente, si possono ottenre variazioni del mapping Flat scambiando di “ruolo” le coordinate del punto della mesh con quelle dello spazio delle tessiture.Per esempio M(x,y,z) = (z,x,y). L'effetto netto è quello di applicare la tessitura “orientandola” nello spazio della scena in modo differente. Questo è illustrato nella seguente figura:

Allo scopo di offrire un “minimo” di aiuto alla inevitabile piccola confusione ecco di seguito la configurazione della GUI usata per ottenere l'esempio precedente. Le aggiunte in ROSSO non sono presenti nella GUI e le ho aggiunte per essere più chiaro nella spiegazione:

Questo disegno deve essere letto come segue:La coordinata X della tessitura deve essere applicata “lungo” la coordinata z della mesh.La coordinata Y della tessitura deve essere applicata “lungo” la coordinata x della mesh.La coordinata Z della tessitura deve essere applicata “lungo” la coordinata y della mesh.

A rendere le cose più misteriose è possibile attraverso la GUI di Blender NON assegnare ad una coordinata della texture alcuna coordinata della mesh. Questo si fa, nella stessa finestra di cui sopra, assegnando il valore “None” alla coordinata della texture che non si vuole affatto utilizzare.Per esempio nel caso della immagine di Bruce Lee usata come tessitura e “trasformata” da piano a 3d da Blender la coordinata Z della tessitura è ininfluente. Potremmo dunque deciderla di NON applicarla lungo la z della mesh. Ciò si realizza scegliendo nei tre menu a tendina i valori: x-y-None. In maniera non sorprendente il risultato NON cambia rispetto alla configurazione x-y-z, già esaminata in precedenza e per tale ragione non si riporta una nuova immagine relativa a questo caso.

Cube.In questa modalità di proiezione il sistema opera come segue.Per ciascuna faccia della mesh si calcolano i sei prodotti scalari ottenuti tra la normale alla faccia e i tre versori del sistema di riferimento adottato per la mesh:<n,x>, <n,y>, <n,-z>Si osservi che i “pattern” dei segni che possono risultare sono in teoria 8 ma 2 di essi sono impossibili:

1. (+ - - ) : la faccia “fronteggia” l'asse x (ha orientamento RIGHT)2. (+ - +) : la faccia “dà le spalle” all'asse y (ha orientamento BACK)3. (+ + -) : la faccia “”dà le spalle” all'asse z (ha oreintamento BOTTOM)4. (+ + +) : caso impossibile5. (- + +) : la faccia “dà le spalle” all'asse x (ha orientamento LEFT)6. (- - +) : la faccia “fronteggia” l'asse z (ha orientamento TOP)7. (- + -) : la faccia “fronteggia” l'asse y (ha l'orientamento FRONT)8. (- - -) : caso impossibile

I sei casi possibili corrispondono alle sei facce di un cubo. Si opera quindi nei sei casi come segue:• Se la faccia ha orientamento RIGHT ogni suo punto P viene proiettato lungo la direzione x e

diviene un punto P' sul piano RIGHT con coordinate x'=y, y'=z. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (y , z, 0).

• Se la faccia ha orientamento LEFT ogni suo punto P viene proiettato lungo la direzione x e diviene un punto P' sul piano LEFT con coordinate x'=y, y'=z. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (y , z, 0).

• Se la faccia ha orientamento BACK ogni suo punto P viene proiettato lungo la direzione y e diviene un punto P' sul piano BACK con coordinate x'=x, y'=z. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (x , z, 0).

• Se la faccia ha orientamento FRONT ogni suo punto P viene proiettato lungo la direzione y e diviene un punto P' sul piano FRONT con coordinate x'=x, y'=z. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (x , z, 0).

• Se la faccia ha orientamento TOP ogni suo punto P viene proiettato lungo la direzione z e diviene un punto P' sul piano TOP con coordinate x'=x, y'=y. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (x , y, 0).

• Se la faccia ha orientamento BOTTOM ogni suo punto P viene proiettato lungo la direzione z e diviene un punto P' sul piano BOTTOM con coordinate x'=x, y'=y. P' viene a sua volta assegnato al punto dello spazio della texture con coordinate (X=x', Y=y', Z=0), e quindi in definitiva M(P)=M(x,y,z) = (x , y, 0).

Ora io posso però “scambiare” il ruolo degli assi nel mondo della texture rispetto all'oridnamento XYZ standard... e usare pure il valore None usando i famigerati tre pulsantini... Risultato? Difficile ragionarci sopra a meno che non si possieda una superire intuizione dello spazio... Suggerimento per gente normale: non toccare i pulsantini o fare tutte le prove che servono per ottenere il risultato voluto...In ogni caso il risultato che si ottiene con la proiezione cube standard è come segue:

Tube/Cylinder.Questa è una modalità di proiezione NON lineare.Per ciascun punto P = (x, y,z) sulla superficie della mesh si calcola la direzione normale alla maniera di Phong (interpolando in maniera bilineare le normali nei vertici della faccia cui il punto appartiene).Sia NP = ( nx, ny, nz) tale vettore normale, si calcola dunque l'angolo alpha (per esempio in radianti) che la proiezione di tale normale sul piano xy forma con il versore y = (0 1 0), cioè alpha=arcos(ny).Si definisce adesso M(x,y,z) = (alpha/PI -1, z, 0).Il risultato netto è quello di “inserire” la mesh in un tubo orientato lungo la verticale. Sulle pareti del tubo è stata applicata la tessitura, come fosse una “etichetta su una bottiglia”. Tale “etichetta” viene quindi proiettata dentro il tubo e si “appiccica” alla superficie della mesh.I punti la cui normale è ortogonale al versore (0,1,0) non vengono assegnati ad alcun punto nello spazio della tessitura e sono quindi lasciati neri o ricevono la texture dal punto vicino nella direzione radiale.Risultato:

In questo tipo di proiezione scambiare con i famigerati pulsantini il ruolo degli assi nello spazio delle texture può aiutare a orientare differentemente la mesh dentro il “tubo”. Ciò è dimostrato nella seguente figura:

(ERRATA CORRIGE, la didascalia della figura dice “tube standard, ma volevo dire “non standard”...)

Sphere.Questo metodo di proiezione è assolutamente analogo a quello Tube, ma qui gli angoli che misuriamo per ciascun punto sono due: quello della normale al punto con il versore nella direzione delle y e quello con il versore nella direzione delle z.Il risultato (le equazioni sono ottenibili facilmente) è quello di appiccicare la tessitura alla superficie di una sfera che circonda/racchiude la mesh e quindi di proiettare il disegno ottenuto sulla sfera alla geometria della mesh. A scopo ilustrativo si riporta di seguito il risultato ottenibile.