2013-09-06 4 views
5

Ich habe einen 3d Punkt, definiert durch [x0, y0, z0].Wie konvertiert man einen 3D-Punkt in einer Ebene in UV-Koordinaten?

Dieser Punkt gehört zu einer Ebene, definiert durch [a, b, c, d].

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

Wie kann die 3D-Punkt auf ein Paar von (u,v) Koordinaten umwandeln oder Karte?

Das muss etwas wirklich einfaches sein, aber ich kann es nicht herausfinden.

+0

Sprechen Sie über generische Koordinaten (u, v)? Oder möchten Sie einen Punkt im Welt-Raum auf Texturkoordinaten abbilden, die auf einem Dreieck definiert sind? – sbabbi

+0

Ich möchte die Ebene texturieren – tigrou

Antwort

8

Zuerst müssen Sie Ihre u und v Vektoren berechnen. u und v sollen orthogonal zur Normalen Ihrer Ebene und orthogonal zueinander sein. Es gibt keine eindeutige Art und Weise, sie zu definieren, sondern eine bequeme und schnelle Art und Weise kann so etwas wie diese:

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. 

nun ein einfaches Skalarprodukt tun:

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

Beachten Sie, dass dies setzt voraus, dass der Ursprung der Uv-Koordinaten ist der Weltursprung (0,0,0).

Dies funktioniert auch, wenn Ihr Vektor [x0 y0 z0] nicht genau auf der Ebene liegt. Wenn das der Fall ist, wird es einfach auf das Flugzeug projiziert.          

+0

Eine Frage: Was machst du mit 't' Vektor, und wenn' v_coord' berechnet wird, woher kommt 'v' Vektor? – tigrou

+0

@tigrou, sorry, misswrote 'v' für' t'. Bearbeitet – sbabbi

+0

Ich versuchte das "v" und "t" Ersatz vor dem Eintragen eines Kommentars, aber es hat nicht funktioniert, aber der wirkliche Grund war "n", um in meinem Programm falsch zu sein. Ich habe das behoben und es hat funktioniert. Vielen Dank – tigrou

3

Vorausgesetzt, dass Sie die Koordinaten eines beliebigen Punktes in der Ebene finden wollen, in Bezug auf die Koordinaten (u, v) ...

Wenn der Punkt [x0, y0, z0] in der Ebene liegt, dann wissen wir, dass

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

Wo Punkt das Skalarprodukt zwischen zwei Vektoren ist. Dies ist einfach das Umschreiben der Ebenengleichung.

Der Trick besteht darin, zwei Vektoren zu finden, die den planaren Unterraum überspannen. Um dies zu tun, wählen wir einen zufälligen Vektor der Länge 3. Nenne es V0. Ich rufe den planaren Normalvektor an

Als nächstes verwenden Sie das Kreuzprodukt des normalen Vektors N mit V0. Dieser Vektor wird senkrecht zum normalen Vektor sein, außer wir waren extrem unglücklich und N und V0 waren kollinear. In diesem Fall wählen Sie einfach einen anderen Zufallsvektor V0. Wir können sagen, ob die beiden Vektoren kollinear waren, weil dann V1 der Vektor [0 0 0] ist.

Also, wenn V1 nicht der Nullvektor ist, dann dividiere jedes Element durch die Norm von V1. Die Norm eines Vektors ist einfach die Quadratwurzel der Summe der Quadrate der Elemente.

Als nächstes wählen wir einen zweiten Vektor V2, der sowohl zu N als auch zu V1 orthogonal ist. Wiederum macht dies ein Vektor-Kreuzprodukt trivial. Normalisieren Sie diesen Vektor, um auch die Längeneinheit zu haben. (Da wir jetzt wissen, dass V1 ein Vektor mit Einheitsnorm ist, könnten wir einfach durch die Norm (N) geteilt werden.

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

jeder Punkt in der Ebene kann nun trivially als Funktion von (u, v), wie folgt beschrieben werden:

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

Wenn beispielsweise (u, v) = (0, 0), klar, wir bekommen [x0, y0, z0] zurück, also können wir uns diesen Punkt als "Ursprung" in (u, v) -Koordinaten vorstellen. Genauso können wir Dinge wie u und v von jedem Punkt [x, y, z], der bekanntermaßen in der Ebene liegt, wiederherstellen, oder wir können die normale Projektion für einen Punkt finden, der nicht in der Ebene liegt projiziert in diese Ebene.

Verwandte Themen