Author Topic: Passare da coordinate di un oggetto tridimensionale a coordinate "schermo"  (Read 2596 times)

0 Members and 1 Guest are viewing this topic.

zax2010

  • Guest
Da una mia richiesta in chat ad Afazio e successivo scambio di link ed opinioni, nasce questo topic.

La richiesta ad afazio era stata quella del titolo. Pensando avesse qualche formulina già pronta.
La richiesta era relativa in effetti a come "organizzare" in assonometria un oggetto tridimensionale. Ovvero non una prospettiva che richiede qualche accortezza in più, ma la semplice proiezione ortogonale di un oggetto su di un piano comunque orientato nello spazio. In modo da riprodurre a video una vista assonometrica di un oggetto 3D.

Ovviamente sappiamo tutti che le librerie OpenGL o DirectX prevedono già in maniera nativa qualcosa (ed anche più) del genere, ma io volevo qualcosa di "fatto in casa", anche per capire.

Tra i tanti link, ponderosi tomi di geometria proiettiva, ecc. che Afazio mi ha girato è uscito fuori questo:

http://en.wikipedia.org/wiki/3D_projection

La cosa interessante è la matrice rettangolare 3x2 che consentirebbe velocemente di gestire la cosa.
Senonchè l'unico esempio che viene svolto, è assolutamente banale e considera la proiezione di un oggetto 3D su di un piano ortogonale ad uno degli assi del sistema tridimensionale, senza meglio specificare come "riempire" la matrice.

Quindi mi sono messo a ragionarci sopra cercando di trovare la "quadra" il più possibile semplice.

Inquadriamo anzitutto il problema, guardando l'immagine sottostante:



Sono partito dal caso più banale, perchè semplifica assai le cose. Il piano di proiezione è verticale come l'asse z del sistema tridimensionale (i=iniziale) e passa per il punto di coordinate 0,0,0.
Il sistema di riferimento piano (f=finale) ha origine proprio nel punto coincidente con il punto origine del sistema tridimensionale (perchè una volta ottenute le coordinate ad applicare un dx e dy non ci vuol nulla).
Partiamo dal caso semplice in cui il piano sia verticale come l'asse z (del sistema tridimensionale) e che si vogliano calcolare le coordinate xf,yf del punto di coordinate xi,yi,zi.

Se guardiamo dall'alto lo schema della prima figura ci accorgiamo di essere in questa situazione:



e quindi i segmenti xf e y' lì segnati (xf è proprio una delle coordinate che cerchiamo) si ottengono con il più classico dei problemi rotazione di assi, ovvero:

xf=xi*cos(a)+yi*sen(a)
y'=-xi*sen(a)+yi*cos(a)

In teoria se il piano è realmente verticale (ovvero contiene l'asse z) avremmo già finito, perchè abbiamo ricavato la prima coordinata xf e per la seconda vale: yf=zi.
Il tutto avendo sfruttato la sola variabile a, ovvero l'angolo formato dall'asse x con il piano di proiezione.

E se il piano di proiezione non fosse "verticale"?. Poco male, quanto fin qui trovato, ossia xf, vale sempre.
Per capire meglio, immaginiamo di sezionare il piano di proiezione con un altro piano, ad esso ortogonale e che contiene il punti di coordinate xi,yi,zi. Quello che si ottiene è rappresentato nella figura successiva:



l'angolo b è l'angolo (di massima pendenza) che il piano di proiezione genera con il piano xy.
Con semplici considerazioni trigonometriche si ha:

w=zi/tg(b)
1=zi/sen(b)
2=(y'-w)*cos(b)

Ora se provate a sostituire il tutto, e sapendo che la coordinata yf è pari alla somma del segmento 1 e 2, si ottiene:

yf=zi*sen(b)+y'*cos(b)

(o per lo meno penso di aver fatto bene tutti i passaggi e le semplificazioni, per cui a me viene questo).

Poi se ad y' si sostituisce l'espressione prima ricavata, si sarebbe pronti a poter "riempire" la matrice 3x2, di cui sopra, dei numeri giusti.

Faccio presente che alla fine il problema è governato in sostanza da 2 sole variabili, l'angolo a e l'angolo b, al variare dei quali si ottengono tutte le assonometrie che si vuole.
Ed anche che la posizione effettiva del piano, trattandosi di proiezione ortogonale, è assolutamente ininfluente.

Ovviamente il problema si è potuto risolvere con i 2-3 passaggi che ho presentato perchè di natura "semplice", la cosa è abbastanza più articolata nel caso di vista prospettica da trasformare in "vista piana". Lì le variabili sono più numerose e la posizione del piano di proiezione assume importanza.

Ma ad arrivare fin lì non sono interessato.....
« Last Edit: 22 July , 2011, 11:12:42 AM by zax2010 »

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24