Utknąłem na jakiś czas, jak podejść do tego, więc wszelkie sugestie będą mile widziane!
Chcę zmapować teksturę w postaci prawego dolnego trójkąta euklidesowego na hiperboliczny trójkąt na dysku Poincare.
Oto tekstura (lewy górny trójkąt tekstury jest przezroczysty i nieużywany). Możesz to rozpoznać jako część I okręgu Eschera
Przepraszamy, zobacz komentarz, ponieważ nie wolno mi publikować więcej niż dwóch linków!
I tak wygląda mój wielokąt (jest wyśrodkowany na początku, co oznacza, że dwie krawędzie są liniami prostymi, jednak ogólnie wszystkie trzy krawędzie będą łukami kołowymi):
Środek wielokąta jest zachętą trójkąta euklidesowego utworzonego przez jego wierzchołki, a ja odwzorowuję teksturę UV za pomocą jego zachęty, dzieląc go na tę samą liczbę twarzy co wielokąt i odwzorowując każdą twarz na odpowiadającej mu powierzchni wielokąta. Jednak wynik wygląda następująco:
Jeśli ktoś myśli, że można to rozwiązać za pomocą mapowania UV, chętnie podam przykładowy kod, jednak zaczynam myśleć, że może to być niemożliwe i będę musiał napisać własne funkcje mapowania.
ROZWIĄZANE z pewnym dopracowaniem odpowiedzi @ Nathana poniżej, ponieważ linie AB, AC, BC mogą w rzeczywistości być łukami, a nie liniami.
Metoda: wybierz najdłuższą stronę, powiedzmy BC, a następnie podziel ją na parzystą liczbę części. Podziel pozostałe dwie strony na tę samą liczbę części. Zatem linie łączące je (DE w odpowiedzi poniżej) muszą faktycznie być łukami, a nie liniami prostymi. Podziel te nowe łuki zgodnie z wymaganiami, dodaj nowe trójkąty jako ściany, a następnie odwzoruj UV prawy dolny trójkąt tekstury na tych nowych ścianach.
źródło
Odpowiedzi:
Domyślam się, że aby tekstura wyglądała dobrze, musisz również podzielić wnętrze trójkąta i przybliżać nieliniowe mapowanie UV w nim.
Obecnie wygląda na to, że dzielisz się wokół krawędzi trójkąta i tworzysz wachlarz mniejszych trójkątów między krawędzią a wgłębieniem. Byłoby dobrze, gdybyś tylko renderował trójkąt w jednolitym kolorze. Ale podczas nakładania tekstury uzyskuje się nieciągłości na granicach tych podrejonów, ponieważ tekstura jest po prostu rozciągana liniowo na każdym podzielonym trójkącie i nie jest prawidłowo aproksymowana do mapowania hiperbolicznego wzdłuż kierunku promieniowego.
Musisz podzielić na obie osie, coś takiego:
i odpowiednio ustaw wszystkie wierzchołki w przestrzeni ekranu i przestrzeni UV, aby aproksymować współrzędne hiperboliczne we wnętrzu trójkąta. Jeśli podzielisz wystarczająco drobno, powinno to dać złudzenie ciągłego zakrzywiania mapowania tekstur.
źródło