Autor Wątek: zamiana UV na XYZ  (Przeczytany 2959 razy)

Offline TheLoader

  • Użytkownik

# Marzec 15, 2007, 23:13:30
Witam,

Mam trojkat w ktorym kazdy wierzcholek posiada wspolrzedne X,Y,Z oraz koordynanty textury U,V. Znam te wszystkie 5 wartosci dla kazdego wierzcholka trojkata. I teraz wybieram sobie jakies u2 i v2 ktore sa wewnatrz trojkata i chce sprawdzic jakie w tym miejscu mam x,y,z. Czy ktos wie skad moge wziasc gotowa funkcje realizujaca to zadanie ktora jest w miare odporna na typowe bledy obliczeniowe komputerow. W implementacji nad ktora pracuje obecnie niestety wystepuje czesto dzielenie przez bardzo male wartosci i inne podobne a to jak wiadomo konczy sie bledami zaokraglen itd. i w rezultacie funkcja daje czesto zle wyniki.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

st3tc

  • Gość
# Marzec 15, 2007, 23:28:19
ale przecież punktów xyz może być (teoretycznie) nieskończenie wiele ...

Patrząc na Twoje poprzednie posty z lightmapami, ten zapewne dotyczy tego samego. Czemu sobie nie uprościsz ?. Masz trójkąt , masz UV-ki, to leć po nim (po krawędziach) wektorkami z rastrem - od razu masz pozycję XYZ i odpowiadającą mu UV, robisz ray-ka i po sprawie.
« Ostatnia zmiana: Marzec 15, 2007, 23:32:47 wysłana przez el'pompke »

Offline TheLoader

  • Użytkownik

# Marzec 15, 2007, 23:33:18
ale przecież punktów xyz może być (teoretycznie) nieskończenie wiele ...

Patrząc na Twoje poprzednie posty z lightmapami, ten zapewne dotyczy tego samego. Czemu sobie nie uprościsz ?. Masz trójkąt , masz UV-ki, to leć po nim (po krawędziach) wektorkami z rastrem - od razu masz pozycję XYZ i odpowiadającą mu UV, robisz ray-ka i po sprawie.
Nie. Jest dokladnie jeden taki punkt dla danego trojkata.

st3tc

  • Gość
# Marzec 15, 2007, 23:34:19
Nie. Jest dokladnie jeden taki punkt dla danego trojkata.
Nie napisałeś ze UV-ki nie sa zwrapowane ...

st3tc

  • Gość
# Marzec 15, 2007, 23:38:05
Nie ma czegos takiego jak "zwrapowane UV-ki" dla pojedynczego trojkata. Kazdy texel na trojkacie ma inne UV. Napisalem wyraznie, ze "mam trojkat", a nie "mam mesha".

(0,0)------------(10,0)
|                  /
|               /
|             /
|           /
|        /
(0,44)

... hm ... pewnie masz racje i pewnie sie nie znam ...

Offline TheLoader

  • Użytkownik

# Marzec 15, 2007, 23:39:42
Nie ma czegos takiego jak "zwrapowane UV-ki" dla pojedynczego trojkata. Kazdy texel na trojkacie ma inne UV. Napisalem wyraznie, ze "mam trojkat", a nie "mam mesha".

(0,0)------------(10,0)
|                  /
|               /
|             /
|           /
|        /
(0,44)

... hm ... pewnie masz racje i pewnie sie nie znam ...
Aa oto Ci chodzilo z tymi "zwrapowanymi UV-kami", ze UV sa wieksze od 1. Ok, wiec sorry. Dodaje do specyfikacji: Wszystkie U oraz V w trojkacie sa z zakresu 0-1

//EDIT
Cytuj
Czemu sobie nie uprościsz ?. Masz trójkąt , masz UV-ki, to leć po nim (po krawędziach) wektorkami z rastrem - od razu masz pozycję XYZ i odpowiadającą mu UV, robisz ray-ka i po sprawie.
Ale, co mi to da, ze bede znal XYZ na krawiedziach? Ja potrzebuje wszystkie punkty w trojkacie a nie same krawedzie.
« Ostatnia zmiana: Marzec 15, 2007, 23:44:49 wysłana przez TheLoader »

st3tc

  • Gość
# Marzec 15, 2007, 23:42:33
Nie wiem czy to pomoże: w sdk dx-a (o ile pamiętam - ale chyba niestety w starszych wersjach) był samples "pick" albo "pickup".  Taki meszek, klikało się na zwierzaka i progsik podawał UV i punkt kliknięcia.  Robił co prawda w drugą stronę niż Ty chcesz, ale stosunkowo prosto można było tę metodę odwrócić. Pamiętam, ze bardzo sprytnie to wyliczał (na podstawie wektorków na trójkącie o ile mnie pamięć nie myli). Możesz zerknąć jeśli chcesz.

Ale, co mi to da, ze bede znal XYZ na krawiedziach? Ja potrzebuje wszystkie punkty w trojkacie a nie same krawedznie.
Mówiłem o rastryzacji. Idziesz po krawędziach, "omiatając" liniami trójkąt. Taka sama metoda jak przy rastryzacji trianglesików. Nieważne :) - pisałem to w kontekście generacji lightmapek. Pewnie potrzebujesz to do czego innego.
« Ostatnia zmiana: Marzec 15, 2007, 23:44:58 wysłana przez el'pompke »

Offline Areal

  • Użytkownik

# Marzec 15, 2007, 23:54:18
P1,P2,P3 - wspolrzedne punktow trojkata (x,y,z)
T1,T2,T3 - koorydnaty tekstury (u,v)
T - znane Ci koordynatytekstury (u,v)
P - szukany punkt 3D (x,y,z)
a,b - zmienne pomocnicze (skalary)

Uwaga: równania wektorowe

Z równania
T1+(T2-T1)*A+(T3-T1)*B=T
wyliczasz A oraz B

P=P1+A*(P2-P1)+B*(P3-P1)

Pisałem z głowy, więc nie sprawdzałem, ale raczej powinno działać.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Marzec 16, 2007, 00:57:30
Ogólnie dobrym kierunkiem może być zrzutowanie takiego trójkąta na jedną z płaszczyzn XY, XZ, YZ i rozpatrywanie problemu jako 2D z użyciem tzw. współrzędnych barycentrycznych (barycentric coordinates).

Na którą płaszczyznę rzutować? Tu leży właśnie ten pies pogrzebany związany z dzieleniem przez bardzo małe liczby (albo i 0). Trzeba zobaczyć w jaką stronę zwrócony jest trójkąt (na przykład porównując abs() poszczególnych składowych jego wektora normalnego) i jeśli na przykład sterczy pionowo do góry (bo to pionowa ściana), to na pewno nie rzutować go w dół tylko w bok.

Takie rzutowanie polega oczywiście na wykorzystaniu wybranych dwóch współrzędnych wierzchołków przy zignorowaniu trzeciej.

Offline tommyz

  • Użytkownik

# Marzec 16, 2007, 01:00:57
To co Areal zaproponował to już są w zasadzie koordynaty barycentryczne, w 3D.