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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.