Autor Wątek: Dostosowanie obiektu, aby stal prostopadle do trojkata  (Przeczytany 799 razy)

maxest

  • Gość
# Luty 14, 2008, 20:15:38
Wyobrazcie sobie jakis pochylony trojkat. Na trojkacie ma teraz stac np. szescian. Problem: tak obrocic szescian, aby byl pochylony zgodnie z wektorem normalnym trojkata na ktorym sie znajduje - czyli powiedzmy taki spiderman co sobie moze chodzic po scianach i sufitach i zawsze jest ustawiony prostopadle do trojkata na ktorym akurat stoi :).
Nigdy czegos takiego nie implementowalem ale gdybym mial to zrobic, to pewnie bym po prostu uzyl wektora normalnego trojkata na ktorym ma stac postac, po czym wyliczyl sobie wektory forward i right i "wbil" je w podmacierz 3x3 macierzy transformacji "spider-mana". Wtedy mialby on taki sam wektor normalny jak trojkat nad ktorym stoi i wszystko byloby ok.
Jednak w ksiazce "DirectX. Rendering w czasie rzeczywistym" opisany jest inny sposob na osiagniecie tego efektu. Bardzo... skomplikowany bym powiedzial. Autor wyznacza cross product z wektora normalnego trojkata i wektora normalnego "spider-mana", iloczynem skalarnym kata pomiedzy obydwoma wektorami normalnymi, po czym buduje kwaternion obrotu o wyliczony kat wzdluz wyliczonego cross producta.
I wlasnie tutaj pada pytanie: czy rozwiazanie uzyte przez autora tejze ksiazki nie jest zbyt "skomplikowane" w porownaniu do zwyklego "przepisania" wektora normalnego ktore stosujemy w pierwszym opisanym sposobie rozwiazania tego problemu?

Offline Mr. Spam

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

Offline Charibo

  • Redaktor

# Luty 14, 2008, 20:40:57
Ciekawy problem, też nigdy się tym nie zająłem jakoś :)

Pomysł wydaje się dobry, chociaż jadąc po normalnych per-vertex mógłbyś uzyskac "skoki" (w sensie między trójkątami). Per-fragment nie masz jak zwrócic tej normalnej (zinterpolowanej) do VSa do transformacji. Jeśli używasz normalmap, to czytasz ją w VSie (nie wiem jakby wyglądała wydajnośc czegoś takiego - niby vtf jest szybki, ale nie testowałem) i na tej podstawie modyfikujesz model, ale zabawnie wyglądałby spiderman "bujający" się na drobnych bumpach ściany :]

Rozwiązac to pewnie mógłbyś pisząc w jednym passie normalne do tekstury a potem czytac je vtfem. Myślę, że możnaby jednoczesnie renderowac kolor i normalne, wtedy mialbys pass "za darmo", z tym, że używałbyś "mapy normalnych" z poprzedniej klatki  :)

Niestety, wyniki moich dywagacji działałyby tylko na kartach >=GF6, więc nie wiem jak u ciebie by się to sprawdziło i czy w ogóle.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Luty 14, 2008, 20:57:23
Cytuj
Pomysł wydaje się dobry, chociaż jadąc po normalnych per-vertex mógłbyś uzyskac "skoki" (w sensie między trójkątami). Per-fragment nie masz jak zwrócic tej normalnej (zinterpolowanej) do VSa do transformacji.
Kombinowanie z tym w VS'ie jest IMO bez sensu, a skoki można wygładzać raz, interpolując normalne pomiędzy wierzchołkami dla gładkich obiektów, a dwa, interpolując obrót modelu na przejściach skokowych. :)