3D-Modell UV-Entfaltungsprinzip

Anfang des Jahres habe ich für das MAKE-Magazin ein Tutorial darüber geschrieben, wie man aus einer Videospielfigur ein Stofftier macht. Die Technologie nimmt ein vorgegebenes 3D-Modell einer Figur und ihrer Texturen und generiert programmgesteuert Schnittmuster. Während ich eine allgemeine Zusammenfassung geschrieben und den Quellcode auf  GitHub hochgeladen habe , habe ich hier eine ausführlichere Erklärung der Mathematik geschrieben, die dies ermöglicht.

Empfohlene NSDT-ToolsThree.js AI Texture Development Kit  –  YOLO-Generator für synthetische Daten  –  GLTF/GLB-Online-Bearbeitung  –  Online-Konvertierung des 3D-Modellformats  –  programmierbarer 3D-Szeneneditor  –  REVIT-Export-3D-Modell-Plug-in  –  semantische Suchmaschine für 3D-Modelle

Das Ziel meines Projekts besteht darin, ein druckbares Schnittmuster zu erstellen, das nach dem Zusammennähen dem 3D-Ausgangsmodell (in diesem Fall einer Videospielfigur) nahe kommt. Mein technischer Kern besteht darin, eine Texturbilddatei eines 3D-Modells als Schnittmuster zu verwenden. Texturbilder sollten an ihren UV-Nähten zusammengefügt werden können, um die ursprüngliche 3D-Form wiederherzustellen. Das ursprüngliche Texturbild des 3D-Modells ist möglicherweise nicht für die Nahtrekonstruktion optimiert. Dies kann jedoch behoben werden, indem aus dem Originalmodell ein neuer Satz UVs erstellt wird (Nähte sind stärker für Naht optimiert). Unter Berücksichtigung der ursprünglichen UVs und der neuen UVs kann für jede Fläche eine Transformationsmatrix berechnet werden, um das alte Texturbild in das neue optimierte Texturbild umzuwandeln. Die Auflösung der zusammengefügten Rekonstruktion hängt von der Position der Naht und dem Ausmaß der Verformung des UV-Entfaltungsalgorithmus ab.

Wie in der allgemeinen Zusammenfassung erwähnt, bestehen 3D-Modelle aus mehreren unterschiedlichen Funktionen. Es verfügt über Scheitelpunkte, Kanten und Flächen, die seine 3D-Form definieren. Es verfügt außerdem über einen Satz UV-Koordinaten, die definieren, wie die Textur auf jede Fläche projiziert wird. Schließlich verfügt es über Texturbilder, die definieren, wie das 3D-Modell schattiert wird.

UV-Mapping ist der Prozess der Projektion von 3D-Oberflächen auf 2D-texturierte Oberflächen und wird im Bereich der Computergrafik gut untersucht. Jede Fläche des 3D-Modells wird einer Fläche auf der UV-Karte zugeordnet. Jede Fläche auf der UV-Karte entspricht einer Fläche im 3D-Modell, und UV behält die Kantenbeziehung zwischen den Flächen des 3D-Modells bei. Dr. Yuki Igarashi von der Universität Tsukuba erkannte diese Eigenschaft von UV und veröffentlichte sie in ihren Aufsätzen  Plushie: An Interactive Design System for Plush Toys  (SIGGRAPH 2006) und Pillow: Interactive Flattening of a 3D Model for Plush Toy Design (SIGGRAPH 2007). Verwenden Sie UVs, um Schnittmuster aus dynamisch erstellten 3D-Modellen zu erstellen. Der spezifische Algorithmus für ihr UV-Mapping ist ABF++.

Da eine UV-Karte als Nähmuster verwendet werden kann, kann dies auch für ein Texturbild gelten, da die UV-Strahlen das Texturbild auf das 3D-Modell abbilden. Texturen können auf den Stoff gedruckt werden und das aus dem Muster genähte Stofftier behält die Farbinformationen des ursprünglichen 3D-Modells.

Allerdings ist nicht jede UV-Karte für die Schnittmustererstellung optimiert. Wie Sie oben sehen können, sind die UVs übereinander gefaltet, sodass UVs und Körper halbiert sind. Dies ist eine beliebte platzsparende Technik in der Grafik von Videospielen. Der Kopf ist außerdem viel größer als der Körper, sodass der Kopf in Videospielen feinere Details aufweist. Diese Optimierungen eignen sich nicht für Nähmuster, da wir möchten, dass die Proportionen des Körpers im 3D-Raum ungefähr denen im 2D-UV-Raum entsprechen.

Unterschied in der endgültigen Auflösung, von Igarashi

Die Nähte der UV-Cluster werden zu den Nähten des fertigen Stofftiers. Ausgehend von demselben 3D-Modell bestimmt die Lage der Nähte die Auflösung des endgültigen genähten Stücks.

Die ursprünglichen UV-Farben meiner Modelle waren nicht für die Herstellung von Stofftieren geeignet, daher habe ich meine eigenen UV-Farben erstellt, um sie für das Nähen zu optimieren. Die meisten modernen 3D-Grafikprogramme verfügen über UV-Mapping-Funktionen (Maya, Blender, 3ds Max usw.). In meinem Projekt habe ich UVLayout verwendet, ein spezielles UV-Mapping-Tool, aber wie im Artikel des MAKE-Magazins zu sehen ist, funktioniert Blender auch einwandfrei.

Teil meiner letzten UV-Karte

Mit der neu erstellten UV-Map möchte ich eine entsprechende neue Texturmap erstellen und diese als mein endgültiges Nähmuster drucken. Hier bietet sich die lineare Algebra an.

Polygonale Flächen auf der UV-Karte werden in Dreiecke unterteilt. Jede Dreiecksfläche im alten Original-UV wird über ihre Beziehung zur gleichen Fläche im 3D-Modell einem Dreieck im neuen UV zugeordnet. Da die beiden Dreiecke die gleiche Form darstellen, aber unterschiedliche Koordinaten auf der UV-Karte haben, kann die Transformationsmatrix zwischen den beiden Dreiecken berechnet werden. Dreiecke werden verwendet, weil wir quadratische Matrizen für Berechnungen verwenden möchten. Diese Transformationsmatrix kann verwendet werden, um die entsprechenden dreieckigen Bereiche auf der alten Textur zu transformieren, um die neuen dreieckigen Bereiche auf der neuen Textur zu schattieren. Stackoverflow bietet eine großartige Erklärung , wie man eine Transformationsmatrix basierend auf den Koordinaten zweier Dreiecke berechnet, zusammen mit einem nützlichen Codeausschnitt, den ich verwendet habe.

Wenn Sie die Transformationsmatrix für jedes UV-Dreieck berechnen und das entsprechende Texturdreieck transformieren, ist das Endergebnis eine neue Textur. Wenn Sie neue Texturen und neue UVs auf das ursprüngliche 3D-Modell anwenden, sollte es keinen Unterschied in seinem visuellen Erscheinungsbild geben.

In meiner Implementierung werden die UV-Koordinaten zunächst den Pixelkoordinaten auf dem Texturbild zugeordnet und dann die Transformationsmatrix berechnet. Die Zuordnung (kombiniert mit der Gleitkomma-Ungenauigkeit) verursachte einige Rundungsprobleme (da Pixelkoordinaten Ganzzahlen sein müssen), die beim Lösen der Transformationsmatrix zu singulären Matrizen führten. Meine knifflige Lösung bestand darin, eine der Pixelkoordinaten eines der UV-Punkte um 1 Pixel zu versetzen. Ich denke, 1 Pixel auf dem endgültigen gedruckten Muster ist weniger auffällig.

Zum Beispiel:

Oben sehen Sie das 3D-Modell, wobei das hervorgehobene Gesicht das interessierende Gesicht ist.

Die UV-Koordinaten des Gesichts auf der ursprünglichen UV-Karte lauten (0,7153, -0,2275), (0,78, -0,1982), (0,7519, -0,0935), (0,7207, -0,0382).

Wie Sie sehen können, bilden UVs Texturbilder auf 3D-Modelle ab.

Diese spezielle UV-Fläche steuert einen kleinen Teil des Texturbildes.

Die hervorgehobenen Gesichter im 3D-Modell entsprechen auch den Gesichtern auf der neuen UV-Karte, die ich erstellt habe.

Seine Koordinaten sind (0,046143, 0,63782), (0,133411, 0,683826), (0,09056, 0,660572), (0,108221, 0,6849).

Bei zwei UV-Koordinatensätzen habe ich das UV-Quadrat in zwei Dreiecke zerlegt und die Transformationsmatrix berechnet.

Zur Berechnung der Transformationsmatrix wird die Gleichung wie folgt aufgestellt:

Dabei ist W die Matrix mit den neuen UV-Koordinaten, A die Transformationsmatrix und Z die Matrix mit den alten UV-Koordinaten.

Aufgrund der Verwendung homogener Koordinaten sind W und Z 3×3-Quadratmatrizen mit der letzten Zeile [1 1 1], und A ist ebenfalls eine 3×3-Quadratmatrix mit der letzten Zeile [0 0 1]. Weitere Einzelheiten finden Sie unter Affine Transformationen .

Das Füllen unserer Matrix mit realen Koordinaten ergibt die folgenden zwei Gleichungen. Die ursprünglichen UV-Koordinaten werden den Pixelkoordinaten (384, 72), (396, 80), (401, 67), (383, 61) zugeordnet. Die neuen UV-Koordinaten werden auf (29, 174), (23, 185), (33, 188), (35, 172) abgebildet. Ich verwende Pixelkoordinaten zur Konvertierung.

Wie bereits erwähnt, gibt es zwei Gleichungen, da ich das Viereck in zwei Dreiecke teile.

Um nach A aufzulösen, kann ich den Kehrwert von Z nehmen und ihn mit W multiplizieren. Da Z eine quadratische Matrix ist, ist Z invertierbar, da seine Determinante ungleich Null ist. Die Determinante von Z ist ungleich Null, da die Determinante die Fläche des Dreiecks darstellt, das sie umschließt.

In einer realen Implementierung habe ich dieses Problem jedoch auf direktere Weise gelöst, d. h. indem ich eine Matrixmultiplikation zwischen A und Z durchgeführt und das System der Unbekannten gelöst habe. Lesen Sie hier mehr darüber.

Wenn ich es auf den ursprünglichen UV-gesteuerten Texturbildbereich anwende, erhalte ich das folgende konvertierte Texturbildfragment:

Nach der Konvertierung jedes Texturbildbereichs verfügen Sie über das folgende Texturbild, das zum Drucken bereit ist. Der orangefarbene Pfeil zeigt an, wo der transformierte Texturfleck in das gesamte Texturbild passt.

Das ist eine eher theoretische/mathematische Erklärung, wie man aus einem 3D-Modell ein Schnittmuster erstellt.


Ursprünglicher Link: 3D-Ausstellung 2D-Mathematikprinzipien - BimAnt

Supongo que te gusta

Origin blog.csdn.net/shebao3333/article/details/135448535
Recomendado
Clasificación