2013-09-06 23 views
5

Ho un punto 3d, definito da [x0, y0, z0].Come convertire un punto 3D su un piano in coordinate UV?

Questo punto appartiene a un piano, definito da [a, b, c, d].

normal = [a, b, c], e ax + by + cz + d = 0

Come si può convertire o mappare il punto 3D per un paio di (u,v) coordinate?

Questo deve essere qualcosa di veramente semplice, ma non riesco a capirlo.

+0

Stai parlando di coordinate generiche (u, v)? O stai provando a mappare un punto nello spazio del mondo alle coordinate della trama definite su un triangolo? – sbabbi

+0

Voglio textureare il piano – tigrou

risposta

8

Prima di tutto, è necessario calcolare i vettori u e v. u e v devono essere ortogonali al normale del piano e ortogonali tra loro. Non v'è alcun modo unico per definirli, ma un modo comodo e veloce può essere qualcosa di simile:

n = [a, b, c] 
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c. 
v = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it. 

Ora un prodotto scalare semplice farà:

u_coord = dot(u,[x0 y0 z0]) 
v_coord = dot(v,[x0 y0 z0]) 

Si noti che questo presuppone che l'origine delle coordinate uv è l'origine del mondo (0,0,0).

Questo funzionerà anche se il vettore [x0 y0 z0] non giace esattamente sul piano. Se questo è il caso, lo proietterà semplicemente sull'aereo.          

+0

Una domanda: cosa fai con 't' vector, e quando' v_coord' è calcolato, da dove viene il vettore 'v'? – tigrou

+0

@tigrou, mi dispiace, ho scritto 'v' per' t'. Modificato – sbabbi

+0

Ho provato la sostituzione di 'v' e' t' prima di inserire un commento ma non ha funzionato, ma la vera ragione era 'n' essere errata nel mio programma. Ho risolto questo e ha funzionato. Grazie – tigrou

3

Supponendo che si desidera trovare le coordinate di qualsiasi punto del piano, in termini di coordinate (u, v) ...

Se il punto [x0, y0, z0] giace nel piano, allora sappiamo che

dot([a,b,c],[x0,y0,z0]) = -d 

Dove punto è il prodotto scalare tra due vettori. Si tratta semplicemente di riscrivere l'equazione del piano.

Il trucco consiste nel trovare due vettori che si estendono nel sottospazio planare. Per fare questo, scegliamo un vettore casuale di lunghezza 3. Chiamalo V0. Chiamerò il vettore normale planare

N = [a,b,c] 

Successivamente, utilizzare il prodotto incrociato del vettore normale N con V0.

V1 = cross(N,V0) 

Questo vettore sarà ortogonale al vettore normale, a meno che non siamo stati molto sfortunati e N e V0 stati allineati. In tal caso, scegli semplicemente un altro vettore casuale V0. Possiamo dire se i due vettori erano collineari, perché allora V1 sarà il vettore [0 0 0].

Quindi, se V1 non è il vettore zero, quindi dividere ciascun elemento per la norma di V1. La norma di un vettore è semplicemente la radice quadrata della somma dei quadrati degli elementi.

V1 = V1/norm(V1) 

Successivamente, selezionare una seconda V2 vettore ortogonale sia N e V1. Ancora una volta, un prodotto vettoriale trasversale lo fa banalmente. Normalizza quel vettore per avere anche la lunghezza unitaria. (Dato che ora sappiamo che V1 è un vettore con unità di misura, potremmo semplicemente averlo diviso per norma (N).)

V2 = cross(N,V1) 
V2 = V2/norm(V2) 

qualsiasi punto del piano può ora essere descritto banalmente come funzione di (u, v), come:

[x0,y0,z0] + u*V1 + v*V2 

Ad esempio, quando (u, v) = (0, 0), chiaramente otteniamo indietro [x0, y0, z0], quindi possiamo pensare a quel punto come "origine" nelle coordinate (u, v).

Allo stesso modo, possiamo fare cose come recuperare uev da qualsiasi punto [x, y, z] che è noto giacere nel piano, o possiamo trovare la proiezione normale per un punto che non è nel piano proiettato su quel piano.