Ordnen Sie eine Textur einem hyperbolischen Dreieck zu

9

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

Drahtgitterpolygon

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:

Strukturiertes Polygon

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.

Einfach? Ganz und gar nicht. Aber es hat funktioniert. Fisch 1 Fisch 2

Lewy Blue
quelle
Hier ist die Textur, die ich verwende: i.stack.imgur.com/SEi0G.png
Lewy Blue
1
Ich nehme an, das Problem ist das Scheren des Bildes? Ich sehe, dass dies passiert, wenn Sie einen inkonsistenten Abstand zwischen den Eckpunkten der dreieckigen Unterteilung haben. Ich vermute, Sie verwenden konsistente Schritte für Ihr UV-Mapping, um den Schereffekt zu erzielen.
Daniel M Gessel
Ich habe tatsächlich behoben, dass kurz nach dem Posten, indem ich die Unterteilungen konsistent und kleiner gemacht habe, die Scherung etwas (wenn auch nicht vollständig) behoben wurde. Die Textur ist jedoch immer noch sehr verzerrt. Ich arbeite unten an einem @ Nathan-Vorschlag, der zumindest eine viel feinere Unterteilung ermöglicht.
Lewy Blue
1
@Looeee Könnten Sie bitte Ihren Code übergeben, ich bin sehr interessiert an diesem Bereich der Grafik
x-rw
Ja, meinen Code finden Sie hier: github.com/looeee/blackthread-heroku/tree/master/assets/js/src/… Und die Live-Version: blackthread.io/experiments/eschersketch Ehrlich gesagt, es ist so lange her, dass ich gesucht habe Ich kann mich nicht erinnern, wo im Code die Funktionen sind, die dies lösen, aber wenn Sie Probleme haben, einen Sinn daraus zu ziehen, schreiben Sie mir hier einen weiteren Kommentar und ich werde einen Blick darauf werfen.
Lewy Blue

Antworten:

8

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:

Geben Sie hier die Bildbeschreibung ein

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.

Nathan Reed
quelle
1
Danke, ich werde es versuchen. Es war eine meiner ursprünglichen Methoden zum Erstellen des Polygons, jedoch mathematisch viel komplexer, so dass ich mich für die einfachere Methode entschieden habe. Ich werde es noch einmal versuchen und mich melden.
Lewy Blue
Danke. Ich konnte Ihren Vorschlag in eine Lösung umwandeln. Siehe meine Bearbeitung oben.
Lewy Blue