Prozedurale Projektion von Mesh Faces in Textur
-
Hallo
Normalerweise geht man von einer Textur aus und mappt diese mit Tex Coords auf die Faces eines Meshes. Ich möchte den Weg rückwärts gehen. Ausgehend von einem Mesh ohne Tex Coords sollen alle Faces proportional zu ihrer Grösse auf eine Textur vordefinierter Grösse ohne Inhalt abgebildet werden.
Am liebsten wäre mir ein Ansatz, wo ich keine Liste der generierten Tex Coords haben müsste, sondern nur anhand von Face Index und Face Fläche in Echtzeit ermitteln könnte, welche Tex Coords hierzu gehören. Gibt es hierzu Ideen oder bewährte Ansätze? Oder komme ich nicht darum herum, die Tex Coords zu speichern?
Hintergrund ist, dass ich für eine Oberflächensimulation Daten zu beliebigen Meshes speichern möchte in beliebiger Auflösung. Die Meshes kommen ohne Tex Coords und ich würde dies gern so beibehalten. 3D Texturen sind nicht effizient genug.
FG
-
Es gibt für deine Aufgabe Texturkoordination zu erzeugen 3 Standarfverfahren.
Kubemapping, Spheremapping und Zylinder-Mapping.
Schau dir einfach mal an, wie dort diese 3 Sachen gehen. Ausgehend davon kannst du dann dir auch Algorithmen überlegen, welche besser zu der Form deiner 3D-Figur passen.
Wenn du z.B. bevorzugt Köpfe von Personen texturieren willst, dann würde ich ein Beispielkopf erzeugen. Von diesen ziehst du dann quasi die Haut ab und legst sie auf einer Rechteckigen Stoffbahn ab. Die so erzeuge Gesichtsmaske kannst du dann auch über andere Köpfe ziehen (Bissel wie, als ob sie aus Gummi wäre). Bei Blender sagt man glaube Sculping zu diesen Schritt.
-
Danke erstmal für deine Antwort. Die 3 Verfahren sind nicht präzise genug, aber von dem was ich sonst noch so gelesen habe bin ich wieder einmal mit einem Packing Problem konfrontiert -- mit anderen Worten, ich muss eine andere Lösung finden.
Wie gesagt, die Meshes sind im Prinzip beliebig und ich möchte im Prinzip Texturkoordinaten so erzeugen, dass sie eine beliebig dimensionierte 2D Textur möglichst komplett ausfüllen. Eine Art Funktion f(x, y, z) <=> t(u, v) für alle Punkte auf der Oberfläche des Meshs.
-
Sind deine Meshes so gebaut, dass man sie alle zu ein Kugel verformen könnte?
Ein Ring z.B. wäre nicht möglich.
Wenn du die alle als Kugel verformen könntest, dann könntest du dir z.B. ein Algorithmus ausdenken, welcher deine Objekte wie ein Luftballon aufbläßt, bis sie eine Kugel sind und schon hättest du per Spheremapping dann Texturkoordinaten. Der Vorteil gegenüber den traditionellen Spheremapping wäre, dass du die Texturkoordination möglichst gleichmäßig über das Mesh verteilst.
-
Ich beschäftige mich gerade mit genetischen Algortihmen, um die KI für mein nächstes Spiel zu schreiben und mir ist das gerade eine Idee für dein Problem gekommen.
Stell dir deine Mesh-Oberfläche als Menge von 2D-Flächen vor. Z.B. Polygone, Dreicke, Vierecke... (Patches genannt)
Aufgabe ist es ja, diese Menge an Patches auf ein Rechteck(Unsere Textur) abzulegen, wobei die Nachbarschaftsbeziehungen der Patch-Kanten möglichst erhalten bleiben soll. Es gibt viele verschiedene Lösungen, wie diese Patches auf der Texture positioniert werden können. Jeder Lösungsansatz kann über eine Bewertungsfunktion (Wie gut bleibt das Nachbarschaftsverhältnis erhalten) bewertetet werden. Es ist die Lösung mit den größten/kleinsten Punktwert gesucht.
Ein genetischer Algorithmus ist ja genau dafür gemacht, aus einer großen Lösungsmenge die zu finden, welche laut einer Bewertungsfunktion gut passt.
Du müsstest dir quasi nur noch überlegen, wie die Funktion aussehen könnte, welche eine gegebene Lösung etwas modifziert/ mit anderen LÖsungen matcht und was genau das Genom überhaupt darstellt.
Ich selbst kann dir in ein paar Wochen dann sagen, wie das konkret geht Bis dahin arbeite ich mich selber jetzt in diesen Themengebiet ein.
Blender besitz eine Smart UV-Mapping-Funktion, wo man diese ausgeschnittenen Patches möglichst zusammenhängend bekommt und nur noch auf die Texture platziert/skaliert. Das wäre der schnellste Weg, wenn man einfach diese Blender-Funktion verwenden würde.
Vielleicht haben ja die Gurus hier noch paar Ideen. Ich selbst bin ja hier mehr so ihr Stift, der erstmal die 'einfachen' Anfragen vorab für sie klärt.
-
Hi!
Das perfekte Standardverfahren zur Mesh-Parametrisierung gibt es nicht. Im Allgemeinen muss man auch fast immer einen Kompromiss zwischen längenerhaltenden (isometric maps), flächenerhaltenden (equiareal maps)
und winkelerhaltenden (conformal maps) Projektionen eingehen (siehe dazu auch den "Klassiker" eine Kugel zu einem ein Rechteck aufzurollen bei Weltkartenprojektionen - so schön wie bei einem Würfel, den man nur aufzuklappen braucht klappt es leider nur selten).Es existieren dazu einige Ansätze - ich selbst habe davon zwar noch keinen umgesetzt, aber ich kann dir immerhin ein wenig Literatur aus meiner Sammlung nennen, die sich mit dem Thema befasst - vielleicht hilft das ja weiter.
Schnelle Lösungen sind das jedoch leider alle nicht, da muss man schon einiges an Aufwand reinstecken:Guter Stichwortgeber:
Stanford-Veranstaltung zur Mesh-Verarbeitung, 1. Kapitel und 2. Kapitel zur Mesh-Parametrisierung.Papers:
Least Squares Conformal Maps for Automatic Texture Atlas Generation, Levy et al. 2002
Intrinsic Parameterizations of Surface Meshes, Desburn et al. 2002
Non-Distorted Texture Mapping Using Angle Based Flattening, Sheffer/de Sturler, 2001
MIPS: An Efficient Global Parametrization Method, Hormann/Greiner, 2000
An Adaptable Surface Parametrization Method, Degener et al. 2003
Discrete Tensorial Quasi-Harmonic Maps, Zayer et al. 2005Hoffe das hilft weiter und demotiviert nicht etwa, weil ich hier grad ne ganze Schubkarre ausgekippt hab
Gruss,
Finnegan
-
Danke. Muss mich mal einlesen. Leider hat man ja mit Arbeit und allem heute nicht mehr so viel Zeit wie früher
-
Noch ein paar Anmerkungen: Die Verfahren in den Papers sind natürlich für beliebige Meshes (wie von dir erwähnt), für spezielle Kategorien von Meshes - z.B. für parametrische Flächen die du selbst berechnest kann es natürlich wesentlich simplere direkte Ansätze geben (bspw. als Texturkoordinaten direkt die uv-Koordinaten der Flächenfunktion verwenden - ggfs. reparametrisiert, so dass Längen in der Abbildung erhalten bleiben).
Ein sehr simpler Ansatz für topologisch kugelähnliche Meshes (Konvex und Genus 0, also ohne Loch wie ein Donut oder eine Kaffeetasse), der allerdings meist keine guten Ergebnisse liefert ist das Mesh mehrfach via Laplace-Operator zu glätten, es zu einer Kugel aufzublähen und dann die Texturkoordinaten auf Basis der Kugel zu bestimmen. Das kommt alles darauf an mit was für Meshes du zu tun hast. Können diese beliebig sein, kommst du nicht um solche umständlicheren Ansätze wie die in den Papers beschriebenen herum.
Ansonsten wäre es auch nicht verkehrt anhand der Stichworte nochmal selbst zu recherchieren ob es nicht noch ein paar neuere Ideen gibt, die Papers haben schon ein paar Jahre auf dem Buckel, ich könnte mir vorstellen dass die Verfahren mit der Zeit noch etwas verfeinert wurden.
Finnegan
-
dafuer hab ich mal http://hhoppe.com/perfecthash.pdf verwendet.