25.09.2019 Views

3D GRAPHICS - PREVIEW

BASI DI GRAFICA 3D Vettori, Quaternioni, Matrici, Spazi PIPELINE DI RENDERING - SHADERS Forward, Deferred, Vertex Shader, Fragment Shader, Surface Shader, Lighting, Lambert, Blinn Phong, PBR

BASI DI GRAFICA 3D Vettori, Quaternioni, Matrici, Spazi PIPELINE DI RENDERING - SHADERS Forward, Deferred, Vertex Shader, Fragment Shader, Surface Shader, Lighting, Lambert, Blinn Phong, PBR

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

1 INDICE<br />

<strong>3D</strong> <strong>GRAPHICS</strong><br />

[0] - Basi di Grafica <strong>3D</strong><br />

1 – Introduzione ............................................................................................................................... 4<br />

1.1 - La scena ed il World Space ............................................................................................6<br />

1.2 – Coordinate .......................................................................................................................... 8<br />

2 - Trasformazioni ........................................................................................................................ 10<br />

2.1 - Traslazione, rotazione e scala ................................................................................... 10<br />

2.2 - Rappresentare le trasformazioni ............................................................................. 12<br />

2.3 – Vettori ................................................................................................................................. 15<br />

2.3.1 - Lunghezza di un vettore <strong>3D</strong>................................................................................. 18<br />

2.3.2 - Somma tra due vettori <strong>3D</strong> .................................................................................. 20<br />

2.3.3 - Sottrazione tra due vettori <strong>3D</strong> ........................................................................... 21<br />

2.3.4 - Moltiplicazione tra un vettore <strong>3D</strong> ed uno scalare ..................................... 22<br />

2.3.5 - Normalizzazione di un vettore <strong>3D</strong> ................................................................... 23<br />

2.3.6 - Moltiplicazione tra vettori: Dot product ........................................................ 24<br />

10 - Pipeline di Rendering - Shaders: Conclusioni ......................................................... 196<br />

GLOSSARIO ..................................................................................................................................200


| 2


<strong>3D</strong> <strong>GRAPHICS</strong><br />

3 [0] - Basi di Grafica <strong>3D</strong>


1 – Introduzione | 4<br />

1 – Introduzione<br />

Lo scopo di questo libro è quello di fornire al lettore una visione ampia e<br />

dettagliata del funzionamento di un “motore grafico” moderno, partendo dalle basi<br />

matematiche ( per loro natura, generiche ), passando per la “pipeline di<br />

rendering” fino ad arrivare all’implementazione vera e propria di “shader”<br />

all’interno del motore grafico di Unity <strong>3D</strong>.<br />

Questi argomenti, presi singolarmente, sono spesso troppo vasti per essere<br />

trattati in modo esaustivo in questo volume, il quale invece vuole offrire, tramite<br />

un percorso accessibile fatto di nozioni e ragionamenti, una solida base di<br />

partenza per tutti coloro che, anche per semplice curiosità, sono interessati a<br />

capire meglio cosa si cela dietro la magia della computer graphics real-time.<br />

Per poter comprendere appieno alcuni passaggi è necessario che il lettore<br />

conosca i concetti base dell'informatica ed almeno un linguaggio di<br />

programmazione. Nella seconda parte, per gli aspetti implementativi, faremo<br />

riferimento a Unity <strong>3D</strong>, per cui è consigliabile conoscerne gli aspetti principali per<br />

poter mettere facilmente in pratica gli esempi proposti.<br />

Procederemo a piccoli passi, partendo una domanda che a prima vista potrebbe<br />

sembrare semplice, ma che in realtà, come vedremo, non lo è affatto:<br />

“ Come facciamo a ‘spiegare’ al computer come disegnare un cubo bianco su sfondo nero? ”<br />

Figura 1.1


5 <strong>3D</strong> <strong>GRAPHICS</strong><br />

Ovvero, quali calcoli deve eseguire, e di quali informazioni necessita il computer<br />

al fine di poter disegnare su schermo la scena raffigurata in Figura 1.1?<br />

In altri termini, come facciamo a far sì che il computer sappia che dovrà colorare,<br />

ad esempio, quel preciso pixel dello schermo di bianco, quello di grigio e<br />

quell'altro di nero? (Figura 1.2)<br />

Figura 1.2


1 – Introduzione | 1.1 - La scena ed il World Space 6<br />

1.1 - La scena ed il World Space<br />

Iniziamo ad analizzare meglio in problema: Da quali elementi è composta la scena<br />

che vogliamo visualizzare?<br />

Sicuramente abbiamo un “CUBO”, ma abbiamo anche qualcosa che sta<br />

“osservando” la scena da una certa posizione e angolazione: La “CAMERA”, cioè il<br />

punto dal quale viene “ripresa” la nostra scena. Un ulteriore elemento è la “LUCE”:<br />

Senza luce, infatti, la scena risulterebbe completamente al buio e lo schermo<br />

completamente nero.<br />

Oltre a questi tre elementi, la nostra scena è composta da un’altro elemento<br />

fondamentale:<br />

L’AMBIENTE <strong>3D</strong> stesso. Cioè lo spazio tridimensionale nel quale sono “immersi”<br />

gli elementi di cui sopra.<br />

Che cos’è il nostro ambiente <strong>3D</strong>? E’ un SISTEMA DI RIFERIMENTO composto da<br />

tre ASSI ( chiamati “X”, “Y” e “Z” ) ed un punto di ORIGINE all’incrocio degli assi.<br />

(Figura 1.3)<br />

Figura 1.3<br />

In questo caso abbiamo chiamato asse “X” l’asse orizzontale, con valori negativi<br />

a sinistra e positivi a destra; Asse “Y” l’asse verticale, con valori negativi in basso<br />

e positivi in alto, ed infine asse “Z” l’asse di profondità, con valori negativi indietro<br />

e positivi in avanti.


7 <strong>3D</strong> <strong>GRAPHICS</strong><br />

In realtà non c’è una regola standard: Unity <strong>3D</strong> utilizza questa notazione, ma è<br />

possibile trovare altre notazioni in altri engine ( dove, ad esempio, la “Z” viene<br />

associata all’asse verticale e la “Y” a quella di profondità ): E’ infatti solo una<br />

questione di nomenclatura, il concetto non cambia.<br />

Il sistema di riferimento che rappresenta il nostro ambiente <strong>3D</strong> lo chiamiamo, per<br />

convenzione, WORLD SPACE.


1 – Introduzione | 1.2 – Coordinate 8<br />

1.2 – Coordinate<br />

Fissati gli assi, possiamo quindi individuare dei “PUNTI” dello spazio <strong>3D</strong> ed<br />

attribuirgli delle COORDINATE tramite un gruppo di tre numeri ordinati che<br />

identificano rispettivamente, in ordine, il valore delle singole coordinate sull’asse<br />

X, sull’asse Y e sull’asse Z.<br />

Ad esempio le COORDINATE “3,1,2“ individuano un PUNTO dello spazio <strong>3D</strong> (<br />

WORLD SPACE ) posizionato a 3 unità sull’asse X, a 1 unità sull’asse Y ed a 2 unità<br />

sull’asse Z.<br />

Il valore di ogni singola coordinata è “espresso” in funzione del SISTEMA DI<br />

RIFERIMENTO utilizzato: Senza un SISTEMA DI RIFERIMENTO le coordinate<br />

sarebbero semplicemente un insieme di numeri senza significato. ( Figura 1.4 )<br />

Figura 1.4<br />

Per ogni elemento della nostra scena, possiamo quindi individuare un punto nello<br />

spazio <strong>3D</strong> che ne identifica una POSIZIONE ( Position ).<br />

Possiamo quindi dire che il CUBO e la CAMERA hanno una POSIZIONE all'interno<br />

del nostro SISTEMA DI RIFERIMENTO ( cioè l’ambiente <strong>3D</strong> ). ( Figura 1.5 )


<strong>3D</strong> <strong>GRAPHICS</strong><br />

9 Figura 1.5<br />

Ad esempio, il CUBO in Figura 1.5 ha una POSIZIONE, definita tramite un gruppo di 3<br />

numeri ( le coordinate ) espresse secondo il SISTEMA DI RIFERIMENTO del nostro<br />

ambiente tridimensionale, di “-2 , 0 , 3”.<br />

Analogamente, la nostra CAMERA avrà una POSIZIONE definita dalle<br />

coordinate “1 , 1, -2”.


2 - Trasformazioni | 2.1 - Traslazione, rotazione e scala 10<br />

2 - Trasformazioni<br />

2.1 - Traslazione, rotazione e scala<br />

Oltre alla POSIZIONE, che altre caratteristiche possiamo attribuire agli elementi<br />

presenti in scena, utili a comunicare al computer come disegnare l'immagine di<br />

Figura 1.1?<br />

Se osserviamo meglio il CUBO di Figura 1.1, possiamo notare che questo risulta<br />

leggermente ruotato, nel senso che non ha la faccia completamente rivolta verso<br />

la CAMERA che riprende la scena.<br />

La sola informazione della POSIZIONE non è più sufficiente, quindi; Si rende<br />

necessaria la presenza di una seconda informazione:<br />

La ROTAZIONE ( Rotation ). (Figura 2.1)<br />

Figura 2.1 -ROTAZIONE del CUBO.<br />

Come ultima caratteristica, dopo POSIZIONE e ROTAZIONE, possiamo individuare<br />

anche la SCALA ( Scale ), che indica, ad esempio, di quanto è stato ridimensionato<br />

( ingrandito o rimpicciolito ) il CUBO rispetto al suo stato originale.<br />

Esistono, infine, ulteriori caratteristiche che possiamo associare ad ogni<br />

elemento della scena, come ad esempio lo “SHEAR”, ma poiché raramente<br />

utilizzate in questo campo, le omettiamo.


11 <strong>3D</strong> <strong>GRAPHICS</strong><br />

Chiamiamo l’insieme di queste caratteristiche, associate ad un elemento presente<br />

in scena, “TRASFORMAZIONE” ( Transform ) .<br />

In altri termini infatti, la POSIZIONE, ROTAZIONE e SCALA si possono vedere come<br />

dei “cambiamenti di assetto” rispetto allo stato originale: Delle “Trasformazioni”<br />

appunto. Il CUBO posizionato in un determinato punto ha infatti subìto una<br />

TRASLAZIONE rispetto alla posizione di partenza ( l’origine ). Allo stesso modo, il<br />

CUBO, come abbiamo visto, risulta anche ruotato: Ha subìto infatti anche una<br />

ROTAZIONE.<br />

Quindi per riassumere, la TRASFORMAZIONE indicherà la TRASLAZIONE (<br />

POSIZIONE ), la ROTAZIONE e la SCALA applicate ad un elemento della scena.<br />

Come per la POSIZIONE, anche queste ulteriori caratteristiche sono sempre<br />

espresse in funzione di un SISTEMA DI RIFERIMENTO.


2 - Trasformazioni | 2.2 - Rappresentare le trasformazioni 12<br />

2.2 - Rappresentare le trasformazioni<br />

Iniziamo ad avere un discreto numero di informazioni che possiamo “passare” al<br />

computer affinché lui possa disegnare la nostra scena iniziale ( Figura 1.1 ): Abbiamo<br />

la lista degli elementi ( CUBO, CAMERA, LUCE ) immersi nell’ambiente <strong>3D</strong> ( il<br />

sistema di riferimento WORLD SPACE ) e siamo in grado di descriverne le loro<br />

TRASFORMAZIONI ( Traslazione, Rotazione e Scala ).<br />

Come possiamo rappresentare a computer tali informazioni?<br />

Un concetto può essere rappresentato, infatti, in diverse forme e modi: Ad<br />

esempio per rappresentare un “Cerchio di raggio 3”, possiamo semplicemente<br />

disegnarlo; Ma possiamo anche ricorrere all’equazione della circonferenza, o<br />

ancora, scrivere un algoritmo in un linguaggio di programmazione ( Figura 2.2 ).<br />

Ogni sistema di rappresentazione ha pro e contro e risulta più o meno adatto a<br />

seconda dello scopo.<br />

Figura 2.2 - Diversi modi di rappresentare un cerchio di raggio 3<br />

Ci chiediamo quindi, ad esempio, come possiamo, rappresentare il concetto ed il<br />

valore delle coordinate? Qual è il sistema migliore?<br />

Abbiamo visto che le coordinate tridimensionali ( che identificano una posizione )<br />

sono un gruppo di 3 numeri reali ( x , y e z ). Allo stesso modo possiamo pensare<br />

di associare 3 numeri alla rotazione ( uno per la rotazione attorno all’asse X, uno<br />

per la rotazione attorno all’asse Y e uno per la rotazione attorno all’asse Z ) e altri<br />

tre numeri per la scala ( quanto l’oggetto è ingrandito o rimpicciolito<br />

rispettivamente lungo l’asse X, lungo l’asse Y e lungo l’asse Z ).<br />

Il metodo di rappresentazione delle trasformazioni più immediato, quindi,<br />

potrebbe essere il seguente:


<strong>3D</strong> <strong>GRAPHICS</strong><br />

13 float position_x, position_y, position_z; //traslazione<br />

float rotation_x, rotation_y, rotation_z; //rotazione<br />

float scale_x, scale_y, scale_z;<br />

//scala<br />

Ovvero una variabile numerica ( float ) per ogni valore che andrà a comporre la<br />

nostra trasformazione, per un totale di nove variabili.<br />

Pur rimanendo un metodo valido nella sua semplicità, come vedremo esistono<br />

sistemi di rappresentazioni più adatti al nostro scopo: Infatti a livello di design del<br />

codice questo sistema è tutt’altro che modulare. Inoltre, se ad esempio vogliamo<br />

traslare un elemento di 2 unità verso destra, 3 unità verso l’alto e 1 unità in avanti,<br />

e ruotarlo di 20° sull’asse X, di 30° sull’asse Y e di 5° sull’asse Z, saremo costretti<br />

a scrivere un codice di questo tipo:<br />

position_x+=2;<br />

position_y+=3;<br />

position_z+=1;<br />

rotation_x+=20;<br />

rotation_y+=30;<br />

rotation_z+=5;<br />

Che non solo è verboso ( per ovviare a questo problema basterebbe, in realtà,<br />

racchiudere il tutto sotto una funzione ) ma è propenso agli errori, specialmente<br />

perché l’ordine con il quale andiamo ad effettuare queste traslazioni e rotazioni (<br />

e più in generale qualsiasi trasformazione ) è FONDAMENTALE: Cambiando<br />

l'ordine, infatti, può cambiare il risultato finale.<br />

Se, dato un punto in posizione [x,y,z] nel nostro ambiente <strong>3D</strong>, effettuiamo prima<br />

una certa traslazione “T” e poi una certa rotazione “R” otterremo il punto in una<br />

nuova posizione [x1,y1,z1]. Se, invece, partendo dal medesimo punto iniziale [x,y,z],<br />

effettuiamo prima la rotazione “R” e poi la traslazione “T”, non otterremo il punto<br />

in posizione [x1,y1,z1] ma bensì in un’altra posizione [x2,y2,z2]. ( Figura 2.3 )


2 - Trasformazioni | 2.2 - Rappresentare le trasformazioni 14<br />

Figura 2.3 - Ordine di esecuzione delle trasformazioni.


15 <strong>3D</strong> <strong>GRAPHICS</strong><br />

2.3 – Vettori<br />

Alla luce delle problematiche elencate nel capitolo precedente, proviamo a<br />

cercare un sistema di rappresentazione più adatto: Un’idea potrebbe essere ad<br />

esempio quella di raggruppare le variabili relative ad ogni singola caratteristica<br />

della TRASFORMAZIONE, per rendere il codice più elegante e modulare, in una<br />

semplice struttura di questo tipo:<br />

struct Vector<strong>3D</strong>{<br />

float x,y,z;<br />

}<br />

All’interno della libreria UnityEngine, Unity <strong>3D</strong><br />

fornisce una struttura analoga, chiamata Vector3,<br />

sulla quale si basa la maggior parte delle sue<br />

funzioni di manipolazione delle trasformazioni.<br />

In questo modo siamo in grado di definire la nostra TRASFORMAZIONE con 3<br />

semplici variabili di tipo “Vector<strong>3D</strong>” :<br />

Vector<strong>3D</strong> position;<br />

Vector<strong>3D</strong> rotation;<br />

Vector<strong>3D</strong> scale;<br />

Oltre alla scrittura più “compatta”, il vero vantaggio di questo tipo di<br />

rappresentazione risiede nel suo significato matematico e geometrico, ovvero il<br />

concetto di VETTORE.<br />

Che cos’è un VETTORE? Geometricamente è un segmento orientato; In altre parole<br />

si tratta di una semplice FRECCIA, dotata delle seguenti caratteristiche: Ha una<br />

DIREZIONE, un VERSO, e una LUNGHEZZA ( detta anche modulo, norma o<br />

magnitudine ) ( Figura 2.4 ) .


2 - Trasformazioni | 2.3 – Vettori 16<br />

Figura 2.4 – Un vettore<br />

Così come per le coordinate, anche queste grandezze assumono valore solo se<br />

espresse in funzione di uno specifico sistema di riferimento ( banalmente, per<br />

definire una lunghezza, ad esempio, abbiamo bisogno di un’unità di misura ).<br />

Se “appoggiamo”, o meglio, “applichiamo” un vettore ( si dice, infatti, “vettore<br />

applicato” ) in un punto preciso del nostro spazio tridimensionale, questo<br />

individuerà un secondo punto dello spazio, ovvero quello “indicato” dalla freccia<br />

( Figura 2.5 ), le cui coordinate sono chiamate componenti. Quando applichiamo un<br />

vettore all’origine degli assi, questo individuerà un punto dello spazio, le cui<br />

coordinate coincideranno con le componenti del vettore stesso.<br />

Due ( o più ) vettori aventi la stessa DIREZIONE, VERSO e LUNGHEZZA, anche se<br />

applicati in punti diversi dello spazio, si dicono “vettori equipollenti”. L’insieme di<br />

vettori applicati ed equipollenti tra di loro individuano un vettore ‘astratto’ detto<br />

“vettore libero”.<br />

Figura 2.5


17 <strong>3D</strong> <strong>GRAPHICS</strong><br />

In Figura 2.5 è raffigurato un vettore applicato all’origine ( 0, 0, 0 ) che individua un<br />

punto nello spazio a coordinate ( 3, 2, 1 ).<br />

Definito il VETTORE da un punto di vista geometrico, andiamo a vedere nel<br />

dettaglio quali sono le sue proprietà, quali le operazioni matematiche ad esso<br />

associate, e come questo ci aiuta nella nostra rappresentazione della POSIZIONE,<br />

e delle TRASFORMAZIONI in generale.


2 - Trasformazioni | 2.3 – Vettori 18<br />

2.3.1 - Lunghezza di un vettore <strong>3D</strong><br />

Prima di procedere, vediamo come viene calcolata la LUNGHEZZA di un vettore<br />

<strong>3D</strong> ( detta anche modulo, norma o magnitudine, ed indicata con |v| o ||v|| ). Per<br />

farlo, però, facciamo un passo indietro, e proviamo a calcolare la lunghezza non<br />

di un vettore <strong>3D</strong>, ma bensì di un vettore 2D ( bidimensionale ). Perché? Il motivo<br />

è semplice: per calcolare la lunghezza di un vettore 2D possiamo ricorrere al<br />

famoso TEOREMA DI PITAGORA ( Figura 2.5.1 ).<br />

Figura 2.5.1<br />

Il teorema infatti afferma che, dato un triangolo rettangolo, la somma delle aree<br />

dei quadrati costruiti sui due cateti è uguale all’area del quadrato costruito<br />

sull’ipotenusa.<br />

Nel nostro caso l’ipotenusa coinciderà con il nostro vettore 2D v(x,y), ed i due<br />

cateti avranno rispettivamente lunghezza “x” e lunghezza “y”. Quindi l’area del<br />

quadrato costruito sul primo cateto varrà x*x ( area = lato*lato ), mentre quella<br />

del quadrato costruito sul secondo cateto varrà y*y.<br />

Secondo il teorema di Pitagora, l’area del quadrato costruito sull’ipotenusa varrà<br />

quindi x*x + y*y. Sappiamo anche che la stessa area vale L*L ( dove “L” è la<br />

lunghezza che vogliamo calcolare ), e possiamo quindi scrivere L*L = x*x+y*y, da<br />

cui la formula :<br />

L = SQRT( x*x + y*y )


<strong>3D</strong> <strong>GRAPHICS</strong><br />

19 Indichiamo con SQRT una generica funzione che calcola, e ritorna, la radice<br />

quadrata del valore passato come parametro.<br />

Unity <strong>3D</strong> implementa tale funzione nel metodo statico Sqrt() della classe Mathf.<br />

La lunghezza di un VETTORE <strong>3D</strong> si calcola con il medesimo sistema, aggiungendo<br />

però la componente “z” alla formula, per cui avremo che:<br />

|v| = SQRT( x*x + y*y + z*z )


2 - Trasformazioni | 2.3 – Vettori 20<br />

2.3.2 - Somma tra due vettori <strong>3D</strong><br />

La prima operazione che vediamo è la SOMMA tra vettori:<br />

Dati 2 vettori v1(x1,y1,z1) e v2(x2,y2,z2), la somma tra v1 e v2 restituisce un nuovo<br />

vettore composto dalle somme delle singole componenti dei vettori v1 e v2,<br />

ovvero,<br />

v1+v2 = ( x1+x2 , y1+y2 , z1+z2 )<br />

Facciamo un esempio e vediamo cosa accade a livello geometrico :<br />

Figura 2.5.1<br />

Dati i vettori v1(2,0,-1) e v2(0,1,3), la somma dei vettori ( v3 = v1+v2 ) sarà così<br />

composta: La componente X sarà la somma della componente X di v1 con la<br />

componente X di v2, la componente Y sarà la somma della componente Y di v1 con<br />

la componente Y di v2 e la componente Z sarà infine la somma della componente<br />

Z di v1 con la componente Z di v2. Come si può dedurre dall’immagine ( Figura 2.5.1 ),<br />

geometricamente il vettore risultante dalla somma di due vettori, è un vettore che<br />

parte dal punto di applicazione del primo vettore e termina nel punto individuato<br />

dal secondo vettore applicato al punto individuato dal primo vettore.<br />

La SOMMA tra vettori è commutativa: E’ verificabile facilmente sia a livello<br />

matematico che geometrico: Infatti, se Invece di applicare v2 nel punto<br />

individuato da v1, facciamo il contrario, ovvero applichiamo v1 su v2, otterremo lo<br />

stesso risultato.


21 <strong>3D</strong> <strong>GRAPHICS</strong><br />

2.3.3 - Sottrazione tra due vettori <strong>3D</strong><br />

La SOTTRAZIONE tra due vettori viene calcolata in modo analogo alla SOMMA, ed<br />

ha come risultato un nuovo vettore i cui componenti sono, questa volta, la<br />

differenza delle componenti dei due vettori che stiamo sottraendo, cioè:<br />

v1-v2 = ( x1-x2 , y1-y2 , z1-z2 )<br />

A differenza della somma, la SOTTRAZIONE non è commutativa come possiamo<br />

verificare nel seguente esempio ( Figura 2.5.2 ):<br />

Figura 2.5.2<br />

Geometricamente, infatti, possiamo vedere che i due vettori risultati da v1-v2 e<br />

v2-v1 ( rispettivamente v4 e v5 ) individuano due punti differenti.<br />

E’ interessante notare come i due vettori risultanti abbiano la stessa DIREZIONE,<br />

la stessa LUNGHEZZA ( modulo ) ma VERSO opposto.<br />

Un altro aspetto che è importante notare è il fatto che la LUNGHEZZA dei vettori<br />

risultanti ( v4 e v5 ) non è altro che la DISTANZA tra i punti individuati da v1 e<br />

v2.


2 - Trasformazioni | 2.3 – Vettori 22<br />

2.3.4 - Moltiplicazione tra un vettore <strong>3D</strong> ed uno scalare<br />

Vediamo ora la moltiplicazione tra un vettore ed uno scalare ( cioè un numero ).<br />

Non stiamo ancora parlando di moltiplicazioni tra vettori.<br />

Se v (x,y,z) è il vettore che vogliamo moltiplicare e “a” è il numero per il quale lo<br />

vogliamo moltiplicare, il prodotto v*a produce come risultato un nuovo vettore<br />

che ha come componenti, le singole componenti di v moltiplicate per “a”. Ovvero,<br />

v*a = ( x*a , y*a , z*a )<br />

Figura 2.5.3<br />

Quello che accade a livello geometrico lo possiamo osservare in Figura 2.5.3:<br />

Moltiplicando il vettore “v1” per “2” otteniamo un vettore con la stessa DIREZIONE,<br />

stesso VERSO ed il doppio della LUNGHEZZA. Allo stesso modo, moltiplicato il<br />

vettore “v2” per “0.5” ( cioè ½, ovvero dividendolo per 2 ) otteniamo un vettore con<br />

la stessa DIREZIONE, stesso VERSO e metà LUNGHEZZA. Infine, se moltiplichiamo<br />

il vettore per un numero negativo ( c=-1 ) otterremo un vettore con la stessa<br />

DIREZIONE e VERSO opposto.<br />

Moltiplicando un vettore per “0”, otterremo un vettore NULLO, cioè v0 (0,0,0),<br />

l’elemento neutro dell’operazione di addizione ( e sottrazione ) tra vettori.


23 <strong>3D</strong> <strong>GRAPHICS</strong><br />

2.3.5 - Normalizzazione di un vettore <strong>3D</strong><br />

Normalizzare un vettore significa renderlo “NORMALIZZATO”. Un vettore si<br />

dice NORMALIZZATO quando ha LUNGHEZZA “unitaria” ovvero quando la sua<br />

LUNGHEZZA risulta uguale a 1.<br />

Come facciamo a NORMALIZZARE un vettore?<br />

Alla luce di quanto visto nei capitoli precedenti, possiamo pensare di utilizzare la<br />

MOLTIPLICAZIONE tra un vettore ed uno scalare ( 2.3.4 ) per variare la<br />

LUNGHEZZA del vettore ( mantenendo costante DIREZIONE e VERSO ). Ma per<br />

quale numero possiamo moltiplicare il nostro vettore affinché la sua LUNGHEZZA<br />

risulti uguale a “1” ?<br />

Conoscendo la LUNGHEZZA di un vettore ( si veda 2.3.1 ), se si moltiplica tale<br />

vettore per il reciproco della sua LUNGHEZZA ( ovvero, in altre parole,<br />

semplicemente dividendolo per la sua LUNGHEZZA ), otterremo un vettore con<br />

stessa DIREZIONE e VERSO, e LUNGHEZZA unitaria.<br />

Ad esempio se il vettore “v1” ha LUNGHEZZA 3, il vettore risultante da v1*(⅓) avrà<br />

LUNGHEZZA unitaria.<br />

O ancora, se il vettore “v2” ha LUNGHEZZA 0.5 (cioè ½), il vettore risultante da<br />

v2*2 avrà LUNGHEZZA unitaria.<br />

Entrambi i vettori saranno quindi NORMALIZZATI ( Figura 2.5.4 ).<br />

Figura 2.5.4


2 - Trasformazioni | 2.3 – Vettori 24<br />

2.3.6 - Moltiplicazione tra vettori: Dot product<br />

Vediamo ora il primo tipo di moltiplicazione che possiamo effettuare tra due<br />

vettori: Il DOT PRODUCT ( o “prodotto scalare” -da non confondersi con il<br />

“prodotto tra un vettore ed uno scalare- o “prodotto interno” ).<br />

Il DOT PRODUCT ( il cui simbolo matematico è "•" ) prende in input due vettori e<br />

restituisce in output uno scalare ( cioè un numero ).<br />

Dati i vettori v1(x1,y1,z1) e v2(x2,y2,z2), il DOT PRODUCT v1•v2 è la somma dei<br />

prodotti tra le singole componenti, ovvero<br />

v1•v2 = (x1*x2) + (y1*y2) + (z1*z2)<br />

Geometricamente, il DOT PRODUCT tra v1 e v2, restituisce la LUNGHEZZA della<br />

PROIEZIONE di v1 su v2. ( Figura 2.5.5 ).<br />

Figura 2.5.5<br />

Infatti, se "a" è l'angolo tra v1 e v2, possiamo definire v1•v2 anche come<br />

v1•v2 = |v1|*|v2|*cos(a)<br />

NORMALIZZANDO entrambi i vettori, tale formula si riduce a "cos(a)" ( poiché la<br />

lunghezza di v1 e v2 equivale a 1 ), che a livello geometrico risulta essere proprio<br />

la "proiezione" dell'angolo "a" sull'asse X.<br />

In queste condizioni, grazie alle funzioni inverse trigonometriche, se v1•v2=cos(a),<br />

possiamo calcolare l'ANGOLO tra i due vettori in questo modo:


25 <strong>3D</strong> <strong>GRAPHICS</strong><br />

angoloTraV1eV2 = acos(v1•v2)<br />

Indichiamo con ACOS una generica funzione che calcola, e ritorna, l’arcocoseno del<br />

valore passato come parametro.<br />

Unity <strong>3D</strong> implementa tale funzione nel metodo statico Acos() della classe Mathf.<br />

Quando entrambi vettori sono NORMALIZZATI, possiamo individuare alcuni casi<br />

particolari:<br />

Se v1 e v2 hanno stessa DIREZIONE e stesso VERSO, v1•v2 sará uguale a 1 ( infatti<br />

cos(1) = 1 ).<br />

Se v1 e v2 hanno stessa DIREZIONE ma VERSO opposto, v1•v2 sará uguale a -1 (<br />

cos(180°) = -1 ).<br />

Infine, se v1 e v2 sono PERPENDICOLARI tra di loro, v1•v2 varrá 0 ( cos(90°) e<br />

cos(270°) = 0 ) ( Figura 2.5.6 ).<br />

Figura 2.5.6<br />

In altre parole, in un range tra -1 e 1, il DOT PRODUCT tra due vettori<br />

NORMALIZZATI ci dice, in pratica, quanto il primo vettore "guarda" nella stessa<br />

direzione ( e verso ) del secondo.


2 - Trasformazioni | 2.3 – Vettori 26

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!