Wykonanie kalkomanii

11

Miałem problemy ze znalezieniem informacji na temat naklejek, więc może to pytanie pomoże innym. Implementacja jest przeznaczona dla mechanizmu renderującego.

Czy ktoś może potwierdzić, czy poprawnie wykonałem naklejkę?

  • Definiujesz sześcian o dowolnym wymiarze, który określi objętość projekcji we wspólnej przestrzeni. Sprawdzasz przecięcie trójkąta ze zdefiniowanym sześcianem, aby otrzymać trójkąty, na które rzutowanie będzie miało wpływ.
  • Przycinasz te trójkąty i zapisujesz je.
  • Następnie używasz sztuczek macierzowych, aby obliczyć współrzędne UV dla zapisanych trójkątów, które będą odnosić się do wyświetlanej tekstury.
  • Aby to zrobić, weź wektory reprezentujące wysokość, szerokość i głębokość sześcianu we wspólnej przestrzeni, tak aby fe znajdował się w lewym dolnym rogu.
  • Umieszczasz to w macierzy jako wektory jednostek i, j, k, ustawiasz tłumaczenie dla kostki, a następnie odwracasz tę macierz.
  • Mnożymy wierzchołki zapisanych trójkątów przez tę macierz, w ten sposób uzyskuje się ich współrzędne wewnątrz sześcianu o wielkości od 0 do 1, którego używa się jako współrzędnych UV.
  • W ten sposób masz oryginalne trójkąty, na które rzutujesz i masz dla nich współrzędne UV (współrzędne UV odnoszą się do tekstury, którą rzutujesz).
  • Następnie ponownie zapisujesz zapisane trójkąty na scenie, a one zastępują obszar projekcji wyświetlanym obrazem.

Teraz pytania, na które nie mogłem znaleźć odpowiedzi. Czy ostatni punkt jest właściwy? Nigdy nie robiłem wycinania oprogramowania, ale wydaje się, że jest wystarczająco podatny na błędy, ze względu na ograniczoną precyzję, że będzie trochę walki z wyświetlaną teksturą. Czy sposób poprawienia współrzędnych UV jest również prawidłowy?

dreta
źródło
Oto link z linkami: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Odpowiedzi:

5

Spójrz na ten artykuł:

http://blog.wolfire.com/2009/06/how-to-project-decals/

Wygląda na to, że stosuje dokładnie to samo podejście, z którego korzystasz. Nie mówi o walce z, ale z pewnością może to stać się problemem na większych odległościach.

Moją sugestią byłoby wyłączenie kalkomanii po pewnym dystansie, jeśli walka z staje się bardzo widoczna.

knight666
źródło
widziałem ten artykuł wiele razy, chodzi o to, że w ogóle nie mówi o tym, o co pytam, tak jak wspomniałeś, walki z nie są tak naprawdę kwestią odległości, po prostu próbuję renderować bezpośrednio na istniejącej geometrii i ze względu na ograniczoną precyzję, czy możesz / nie możesz być pewien, że będzie on na szczycie lub dokładnie w tym samym miejscu
dreta
1
Podczas rysowania kalkomanii zawsze można ustawić funkcję porównywania bufora głębokości na mniejszą lub równą niż mniejszą niż tak, że kalkomanie są zawsze rysowane bezpośrednio na powierzchni, na którą wpływają.
jmegaffin
1

To, co zrobiłem, aby rozwiązać walkę Z, polegało na podbiciu wartości Z wierzchołka o niewielką ilość, w moim kalkulatorze cieniującym, po współrzędnych ekranu.

OK ..... Używam dopasowanych kalkomanii z siatki. Tworzę siatkę nxn z Y siedzącym na terenie. Używam kodu, aby znaleźć Y na siatce wielokątów terenu. Po wszystkich transfromach rysuję nad istniejącą geometrią we współrzędnych ekranu. Bufor głębokości ma współrzędne ekranu, więc nieznaczne przesunięcie Z wielokątów kalkomanii w kierunku ekranu zatrzymuje walkę Z. W ten sposób zmniejszyłem o połowę liczbę wielokątów tworzących moje dopasowane naklejki. To jest stary kod 120

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Mam nadzieję, że to wyjaśnia to lepiej .. (zgodnie z żądaniem)

Wszystkie ramy z drutu.

Tylko terenowy.

Mike O
źródło
1
Ta odpowiedź wydaje się szczególnie krótka i nieokreślona. Czy możesz wyjaśnić swoją odpowiedź?
Gnemlock
1
Nietrudno to zrozumieć. Przesuwam wierzchołek tylko odrobinę w Z kierując w przestrzeni ekranu. Ponieważ w OpenGL zawsze patrzysz na dodatnią Z w przestrzeni ekranu, przesunięcie ujemnej Z w niewielkiej ilości naprawia walkę Z. Występuje jednak problem. Przy zmniejszaniu, z może przesunąć kalkomanię znacznie bardziej niż to konieczne. Rozwiązaniem jest przeskalowanie wielkości przesunięcia oka do odległości wierzchołków.
Mike O