Zamapuj teksturę na trójkącie hiperbolicznym

9

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):

Model szkieletowy Wielokąt

Ś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:

Teksturowany Wielokąt

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.

Prosty? Ani trochę. Ale zadziałało. Ryba 1 Ryba 2

Lewy Blue
źródło
Oto tekstura, której używam: i.stack.imgur.com/SEi0G.png
Lewy Blue
1
Zakładam, że problemem jest ścinanie obrazu? Widzę, że tak się dzieje, gdy masz niespójne odstępy między wierzchołkami trójkątnego podziału. Domyślam się, że używasz spójnych kroków do mapowania UV, co daje efekt ścinania.
Daniel M Gessel
Naprawdę naprawiłem to wkrótce po opublikowaniu tego, czyniąc podziały spójnymi i mniejszymi, to naprawia nieco ścinanie (choć nie całkowicie). Jednak tekstura jest nadal bardzo zniekształcona. Pracuję nad sugestią @nathan poniżej, która przynajmniej pozwoli na znacznie dokładniejszy podział.
Lewy Blue
1
@Looeee Czy możesz podać swój kod, jestem bardzo zainteresowany tą dziedziną grafiki
x-rw
Tak, możesz znaleźć mój kod tutaj: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/... A wersja na żywo: blackthread.io/experiments/eschersketch Szczerze mówiąc, minęło dużo czasu, odkąd spojrzałem na to, że nie pamiętam, gdzie w kodzie są funkcje, które to rozwiązują, ale jeśli masz problem z jego zrozumieniem, napisz tutaj inny komentarz, a ja przyjrzę się.
Lewy Blue,

Odpowiedzi:

8

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:

wprowadź opis zdjęcia tutaj

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.

Nathan Reed
źródło
1
Dzięki, spróbuję tego. Była to jedna z moich oryginalnych metod budowania wielokąta, jednak znacznie bardziej skomplikowana matematycznie, więc wybrałem prostszą metodę. Dam mu kolejny zastrzyk i zdam raport.
Lewy Blue
Dziękuję Ci. Udało mi się zmienić twoją sugestię w rozwiązanie. Zobacz moją edycję powyżej.
Lewy Blue