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?
Odpowiedzi:
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.
źródło
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
Mam nadzieję, że to wyjaśnia to lepiej .. (zgodnie z żądaniem)
źródło