2013-09-06 28 views
5

Mam 3d punkt, określony przez [x0, y0, z0].Jak przekonwertować punkt 3D na płaszczyznę na współrzędne UV?

Ten punkt należy do płaszczyzny zdefiniowanej przez [a, b, c, d].

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

Jak można konwertować lub map 3D wskaż pary (u,v) współrzędnych?

To musi być coś naprawdę prostego, ale nie mogę tego rozgryźć.

+0

Czy mówisz o ogólnych (u, v) współrzędnych? A może próbujesz zmapować punkt w przestrzeni świata na współrzędne tekstury zdefiniowane w trójkącie? – sbabbi

+0

Chcę tekstury samolotu – tigrou

Odpowiedz

8

Przede wszystkim należy obliczyć liczbę wektorów u i v. u i v będą ortogonalne do normalnej płaszczyzny i ortogonalne względem siebie. Nie ma unikalny sposób, aby je zdefiniować, ale wygodny i szybki sposób może być coś takiego:

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. 

Teraz prosty produkt kropka zrobi:

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

Uwaga, to zakłada się, że pochodzenie współrzędnych UV jest pochodzenie świata (0,0,0).

To zadziała, nawet jeśli Twój wektor [x0 y0 z0] nie leży dokładnie na płaszczyźnie. Jeśli tak jest, to po prostu rzutuje to na płaszczyznę.          

+0

Jedno pytanie: co zrobić z 't' wektora, a kiedy oblicza się' v_coord', skąd pochodzi wektor v? – tigrou

+0

@tigrou, przepraszam, misswrote 'v' dla' t'. Edytowany – sbabbi

+0

Próbowałem, że 'v' i' t' zastąpienie przed umieszczeniem komentarza, ale to nie zadziałało, ale prawdziwym powodem było 'n' być niepoprawne w moim programie. Naprawiłem to i zadziałało. Dzięki – tigrou

3

Zakładając chcesz znaleźć współrzędne dowolnego punktu na płaszczyźnie, jeśli chodzi o współrzędnych (u, v) ...

Jeśli punkt [x0, y0, z0] leży w płaszczyźnie, wtedy wiemy, że jest kropka między dwoma wektorami. Jest to po prostu przepisanie równania płaszczyzny.

Sztuką jest znalezienie dwóch wektorów, które rozciągają się na podprzestrzeń planarną. Aby to zrobić, wybieramy losowy wektor o długości 3. Nazwij go V0. Nazwałbym później płaski wektor normalny, następnie użyjemy iloczynu normalnego wektora N z V0.

V1 = cross(N,V0) 

Ten wektor będzie prostopadły do ​​wektora normalnego, chyba że byliśmy bardzo pecha i N i V0 były współliniowe. W takim przypadku po prostu wybierz inny losowy wektor V0. Możemy stwierdzić, czy oba wektory były współliniowe, ponieważ wtedy V1 będzie wektorem [0 0 0].

Tak więc, jeśli V1 nie jest wektorem zerowym, to podziel każdy element według normy V1. Norma wektora to po prostu pierwiastek kwadratowy z sumy kwadratów elementów.

V1 = V1/norm(V1) 

Następnie wybieramy drugi wektor V2, który jest ortogonalny zarówno dla N, jak i V1. I znowu, produkt krzyżowy wektor robi to trywialnie. Normalizuj, aby wektor miał również długość jednostki. (Ponieważ wiemy, że V1 jest wektorem z normą jednostki, możemy po prostu podzielić przez normę (N).)

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

dowolnego punktu w płaszczyźnie można teraz opisany trywialny jako funkcja (u, v), w:

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

Na przykład, jeśli (u, v) = (0, 0), wyraźnie otrzymujemy [x0, y0, z0] z powrotem, więc możemy myśleć o tym punkcie jako o "pochodzeniu" w (u, v) współrzędnych.

Podobnie, możemy zrobić takie rzeczy jak odzyskiwanie u i v z dowolnego punktu [x, y, z], który jest znany z tego, że leży w płaszczyźnie, lub możemy znaleźć normalną projekcję dla punktu, który nie znajduje się na płaszczyźnie , rzutowany na ten samolot.

Powiązane problemy