Autor Wątek: Macierz przekształcająca z View Space do Texture Space  (Przeczytany 1215 razy)

Offline Demon

  • Użytkownik

# Czerwiec 11, 2007, 10:46:27
Tak jak w temacie, w jaki sposób uzyskać taką macierz dla danego trójkąta?

Offline Mr. Spam

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

Offline mINA87

  • Użytkownik

# Czerwiec 11, 2007, 13:08:10
Algebra się kłania :)
Ogólnie to macierz przejścia z przestrzeni o bazie B1 do przestrzeni o bazie B2 wyznacza się z wektorów B' które są wektorami bazy B2 przedtsawionymi jako kombinacja liniowa wektorów bazy B1. W tym aktualnym przypadku wektory B2 bazy są od ręki wyrażone w bazie B1, więc to masz z głowy. Teraz pytanie co jest bazą Texture Space? Bazą ortonormalną B1 będziesz miał wektory [1,0,0] [0,1,0] [0,0,1] - z czym Ci się to kojarzy? Osie układu współrzędnych prawda? Teraz pomyśl o texture space - co to jest za przestrzeń? Jak wyglądają tam "osie"? W każdym punkcie płaszczyzny dla której wyznaczasz masz zdefiniowane wektorki tangent, normal i binormal - widzisz analogię teraz? I właśnie te wektorki są bazą przestrzeni tekstury - ba są zapisane nawet w bazie przestrzeni world space. Jeśli chcesz przejść typowo z view space, to przetransformuj wektory tangent, normal i binormal do przestrzeni widoku. Proste. Masz wektory normal i tangent w view space, wyznaczasz wektor binormal za pomocą cross'a i wszystko wrzucasz do macierzy 3x3.
Temat do znudzenia wałkowany, poszukałbyś chwilę i znalazł wszystko, ale cóż...

Offline Demon

  • Użytkownik

# Czerwiec 11, 2007, 13:50:30
A skąd mam wziąć wektory tangent normal i binormal dla tego trójkąta, przecież jego wierzchołki mają koordynaty u, v które mogą się mieć nijak do współrzędnych wierzchołków, np najwyższy wierzchołek trójkąta może mieć najniższą współrzędną tekstury v, do tego jeszcze dochodzi perspektywa.

Offline mINA87

  • Użytkownik

# Czerwiec 11, 2007, 14:01:00
Krótko: UTFG
Dłużej: normal masz, tangent wyznacza się przy pomocy algorytmów, których widocznie nie rozumiesz na chwilę obecną :] Algorytmy te opierają się na liniowości współrzędnych teksturowania - gdy współrzędne zmieniają się w sposób liniowy, to mamy gradient, który można wykorzystać do wyznaczenia wektora stycznego. Taki porsty algorytm nie analizujący siatki sprawdza się często i wywala w kilku szczególnych wypadkach (również wałkowane po 100x na tymże forum chociażby). Jeśli chcesz mieć tangent z prawdziwego zdarzenia to wejdź na stronę nVIDII i obczaj sobie nvMeshMender'a - ten tool generuje _poprawne_ tangenty i normale.
Qrcze troszkę samodzielności. Jeśli nie rozumiesz zagadnienia to szukaj i pogłębiaj wiedzę aż zrozumiesz. Jeśli nie rozumiesz to przeklej kod i na razie olej tę kwestię - zobacz ile razy ten temat był wałkowany na tym forum..

maxest

  • Gość
# Czerwiec 11, 2007, 14:21:57
Pewien nie jestem, ale skoro tangent i binormal sa prostopadle do normal to mozna je bez wiekszego trudu wyznaczyc zamieniajac tylko i negujac jedna wspolrzedna.

Robilem sobie takie demko z OpenAL'em. Aby dzwiek dobrze byl obliczany przez AL'a potrzebowalem wektory forward (wektor predkosci gracza po prostu), up (wektor "w gore") i right. forward mialem - wektor predkosci sluchacza/kamery/gracza (whatever). Right wyznaczylem mniej wiecej taki wzorem:
forward = [fx, fy, fz]
right = [-fz, fy, fx]
Glowy nie daje ze tak wlasnie bylo ale na tym to polega ze zamieniajac ze soba dwie wspolrzedne i negujac jedna z zamioenionych dostajemy wektor prostopadly do naszego wektora wejsciowego.

Potem wyznaczenie up to juz tylko formalnosc - cross(forward, right) i wuala :)

Offline Demon

  • Użytkownik

# Czerwiec 11, 2007, 14:52:23
maxest ale ten sposób który ty podajesz nie nadaje się do wyliczenia prawidłowych wektorów s i t dla teójkąta z przyporządkowanymi koordynatami u, v dla każdego wierzchołka, bo z tego co zrozumiałem to twój sposób wyznacza owszem wektor prostopadły do danego, ale przecież w przestrzeni 3d takich wektorów prostopadłych do wektora normalnego istnieje nieskończoność, a tylko 1 z nich daje rozwiązanie mojego problemu.

// EDIT mINA87 trochę poszukałem info o tangent space i to jest właśnie rozwiązanie którego szukałem, dzięki za info
« Ostatnia zmiana: Czerwiec 11, 2007, 15:47:01 wysłana przez Demon »