Texturkoordinaten berechnen



  • Ich möchte gerne für ein beliebiges Polygon Texturkoordinaten so berechnen, dass die Ränder der Textur sich den Rändern des Polygons befinden. Hier ist ein Bild, wie ich das meine: https://s26.postimg.org/5912r91gp/tex_mapping.png
    Ist mit GIMP gefaked, aber ich hoffe, es wird klar, was gemeint ist.

    Das 'A' links ist das untexturierte Polygon. Das rote Rechteck mit dem Bevel ist die Textur und so wie rechts soll das Ergebnis (ungefähr) aussehen. Was in der Textur links/oben ist, soll auf dem Polygon auf den linken/oberen Rändern sein. Das Gleiche für rechts/unten.

    Ist das überhaupt so umsetzbar? Ich sehe da ein paar Problemstellen, wo es evtl. nicht geht und vielleicht die Textur anders aussehen müsste, um das Endergebnis zu bekommen.

    Ich weiß nicht, wonach ich bei Google suchen soll, um brauchbare Resultate zu finden. Gibt doch sicher einen Fachbegriff für so ein Mapping?



  • Bzw. mehrere Polygone, weil das A ein doofes Beispiel ist. Fällt mir gerade auf. Es soll halt mit Löchern funktionieren.



  • Der leichteste Ansatz wäre, wenn du eine Boundingbox um das A machst und dann für jeden Eckpunkt von den A schaust, an welcher Stelle in der Boundingbox liegt der Punkt.

    https://s26.postimg.org/b6rl2t6o9/tex_mapping.png

    Ich hab mal für zwei Beispielpunkte angegeben, welche Texturkoordinaten diese dann haben würden.

    Bei diesen Lösungsweg werden dann das Loch, was beim A ist nicht mit aus der Textur genommen.

    Willst du eine Lösung, bei der ein Rechteck so verformt wird, dass du damit jedes beliebige Polygon bekommst? Wenn ja, denke ich, dass das eine schwierige Aufgabe werden dürfte.



  • Wenn ich deinen Ansatz richtig verstehe, wären die Texturkoordinaten ja bloß die normalisierten Punkte des Polygons. Damit sähe ich auf dem A nur den Ausschnitt der Textur, den das A abdeckt. Ich möchte aber die gesamte Textur in die Fläche des Polygons quetschen.

    Willst du eine Lösung, bei der ein Rechteck so verformt wird, dass du damit jedes beliebige Polygon bekommst?

    Idealerweise ja, es muss aber kein Rechteck sein.



  • In diesem Falle möchte ich auf folgenden Beitrag hinweisen. Hier geht es zwar um 3D und nicht um 2D-Texturemapping aber von der Aufgabenstellung klingt es ähnlich.

    https://www.c-plusplus.net/forum/339647



  • Ach Mann, und ich hatte gehofft jemand kommt und schreibt "Das ist Dowhatisay-Mapping und hier is wies geht du Kacknoob"



  • Ich würde sagen das geht einfach nicht.

    Deine Textur hat kein Loch, das Ziel-Polygon hat aber eins (bzw. kann eins haben - oder vermutlich sogar mehrere?).
    Vermutlich könnte man da jetzt *irgend ein* Mapping machen das deine Vorgabe "Ränder sollen Ränder bleiben" erfüllt. Aber halt kein "stetiges", und vermutlich auch keines wo du die Texturkoordinaten der verschiedenen Vertices linear interpolieren kannst. Anders gesagt: vermutlich nichts womit du glücklich würdest.

    Beschreib mal was du damit machen/erreichen willst. Vielleicht gibt's ja eine andere Lösung die für dich akzeptabel wäre. Und vor allem machbar ist 😉

    ----

    ps: Bei deinem Beispiel-Bild musste ich an "distance field fonts" denken. Wäre natürlich Zufall wenn das auf dein Problem anwendbar wäre, aber da es so ne coole Technik ist wollte ich es trotzdem erwähnen 🙂



  • Über Distance Fields habe ich auch schon nachgedacht und sogar schon eine halbwegs brauchbare distance transform für Bitmaps implementiert, um damit outlines um Grafiken und Schriften zu ziehen. Mir fehlt das Know-How, um aus diesem Ansatz mehr zu machen.

    Beschreib mal was du damit machen/erreichen willst.

    2 Ziele: Ich möchte für ein 2D-Spiel einen Editor bauen, wo man beliebige Polygone in die Welt malen kann, die dann mit dieser Technik texturiert werden sollen. Und ich möchte damit Schriftzüge texturieren, die auch als Polygone vorliegen, die ich mit Freetype aus Truetype-Fonts generiere. Dafür möchte ich möglichst simple Stil-Vorlagen definieren können, idealerweise einfach nur mit einem entsprechend gestylten Rechteck.

    Mir geht es dabei vor allem darum, dass die Ränder gut aussehen. Ich könnte gut damit leben, wenn es in "der Mitte" nicht korrekt funktioniert, dann ist dort eben immer alles einfarbg.