Ich habe eine Weile darüber nachgedacht, wie ich das angehen soll, daher wären alle Vorschläge dankbar!
Ich möchte eine Textur in Form eines unteren rechten euklidischen Dreiecks auf ein hyperbolisches Dreieck auf der Poincare Disk abbilden.
Hier ist die Textur (das obere linke Dreieck der Textur ist transparent und wird nicht verwendet). Sie können dies als Teil von Eschers Kreislimit I erkennen
Entschuldigung, siehe Kommentar, da ich anscheinend nicht mehr als zwei Links posten darf!
Und so sieht mein Polygon aus (es ist am Ursprung zentriert, was bedeutet, dass zwei Kanten gerade Linien sind, im Allgemeinen sind jedoch alle drei Kanten Kreisbögen):
Das Zentrum des Polygons ist der Incentre des euklidischen Dreiecks, das durch seine Eckpunkte gebildet wird, und ich bin UV-Mapping der Textur unter Verwendung seines Incentre, teile sie in die gleiche Anzahl von Flächen wie das Polygon und ordne jede Fläche der entsprechenden Polygonfläche zu. Das Ergebnis sieht jedoch so aus:
Wenn jemand der Meinung ist, dass dies mithilfe von UV-Mapping lösbar ist, würde ich gerne einen Beispielcode bereitstellen. Ich fange jedoch an zu glauben, dass dies möglicherweise nicht möglich ist, und muss meine eigenen Mapping-Funktionen schreiben.
Gelöst mit einer Verfeinerung von @ Nathans Antwort unten, da die Linien AB, AC, BC tatsächlich Bögen und keine Linien sein können.
Methode: Wählen Sie die längste Seite, z. B. BC, und unterteilen Sie diese in eine gerade Anzahl von Teilen. Unterteilen Sie die beiden anderen Seiten in die gleiche Anzahl von Teilen. Dann müssen die Linien, die diese verbinden (DE in der Antwort unten), tatsächlich auch Bögen sein, keine geraden Linien. Unterteilen Sie diese neuen Bögen nach Bedarf, fügen Sie die neuen Dreiecke als Flächen hinzu und ordnen Sie das untere rechte Dreieck der Textur diesen neuen Flächen zu.
quelle
Antworten:
Ich vermute, dass Sie, um die Textur richtig aussehen zu lassen, auch das Innere des Dreiecks unterteilen und die nichtlineare UV-Abbildung darin approximieren müssen.
Derzeit sieht es so aus, als würden Sie die Ränder des Dreiecks unterteilen und einen Fächer kleinerer Dreiecke zwischen der Kante und dem Incenter bilden. Dies wäre in Ordnung, wenn Sie das Dreieck nur einfarbig rendern würden. Wenn Sie jedoch eine Textur anwenden, erhalten Sie Diskontinuitäten an den Grenzen dieser Unterteilungen, da die Textur nur linear über jedes unterteilte Dreieck gestreckt wird und die hyperbolische Abbildung entlang der radialen Richtung nicht korrekt approximiert.
Sie müssen entlang beider Achsen unterteilen, ungefähr so:
und positionieren Sie alle Scheitelpunkte entsprechend im Bildschirm- und UV-Raum, um die hyperbolischen Koordinaten im Inneren des Dreiecks zu approximieren. Wenn Sie fein genug unterteilen, sollte dies die Illusion einer kontinuierlich gekrümmten Texturabbildung erzeugen.
quelle