Importieren Sie 3D-Modelle in Unity und Fallstricke

Dies ist der dritte Artikel in unserer Reihe über die Arbeit mit 3D-Modellen in Unity. Frühere Artikel: „Funktionen zum Arbeiten mit Mesh in Unity“ und „Unity: prozedurale Bearbeitung von Mesh“ .

In der Welt der Computergrafik gibt es viele Formate für die Darstellung von 3D-Modellen. Einige von ihnen sind universell positioniert, andere sind für bestimmte Aufgaben oder Plattformen optimiert. In jedem Bereich träumen sie davon, mit einem universellen Format zu arbeiten, aber die Realität sagt uns nein. Darüber hinaus führt ein solcher Zoo zu einem Teufelskreis: Die Entwickler von „universellen“ Tools entwickeln ihre eigenen internen Formate, um die vorherigen zusammenzufassen, die Bevölkerung zu vergrößern und Mittel zum Konvertieren von Formaten zu schaffen. Es besteht also ein Problem mit Datenverlust oder -verzerrung während der Konvertierung. Das Problem ist so alt wie die Welt (natürlich die IT-Welt) und hat den Import von Modellen in Unity nicht umgangen.

In diesem Artikel werden wir einige der Schwierigkeiten erläutern , mit denen wir bei der Arbeit mit Modellen in Unity zu kämpfen haben (insbesondere die Funktionsweise von ModelImporter , die unterschiedlichen Darstellungen von 3D-Objekten usw.) sowie welche Tools wir zur Überwindung dieser Schwierigkeiten erstellt haben.



Funktionen von ModelImporter


Denken Sie daran, dass für die Grafikkarten- API das minimale und einzige dreidimensionale Grundelement ein Dreieck ist, während die Geometrie in FBX beispielsweise als Vierecke dargestellt werden kann. Moderne 3D-Pakete zum Erstellen von Modellen erlauben in der Regel unterschiedliche Abstraktionsebenen, aber auch dort erfolgt die Wiedergabe des Ergebnisses durch Dreiecke.

Gleichzeitig sind viele Werkzeuge auf die Arbeit mit Vierecken ausgerichtet, was 3D-Künstler dazu ermutigt, dieses Grundelement als Hauptelement zu verwenden. In solchen Fällen erfordert TK häufig die Triangulation des Modells vor der Implementierung. Wenn die Triangulation nicht durchgeführt wird, führt das entsprechende Unity- Modul im Standardmodus sie automatisch aus, wenn eine Datei hinzugefügt wird. Aus diesem Grund treten Fehler auf, da Triangulationsalgorithmen in verschiedenen Paketen unterschiedlich implementiert sind. Bei der Auswahl einer Diagonale zum Teilen eines Vierecks tritt Mehrdeutigkeit auf, daher die meisten Probleme, die in zwei Gruppen unterteilt werden können.

Der erste bezieht sich auf die Richtigkeit der Anzeige des Modellformulars. Die Form eines nicht planaren Vierecks hängt also direkt von der Wahl der Diagonale ab.


Susanna trianguliert in Blender (Quad-Methode: Schönheit) und Unity (automatisch beim Import)

Darüber hinaus verwendet der normale Kartenbackalgorithmus geteilte Daten, wodurch der Unterschied in der Triangulation zu Artefakten in Form eines Kreuzes auf der Blendung führen kann.


Gesunder Mann Roller und Raucher Roller

Die Probleme der zweiten Gruppe treten beim Textur-Scannen auf. Zum Beispiel haben wir ein Viereck mit einem Winkel, der stumpf genug ist, damit ein Fehler auftritt. Bei der Vorschau in einem 3D-Paket wird es durch eine der Diagonalen in zwei vollständig faltbare Dreiecke unterteilt.


Quellpolygon


In Blender trianguliertes Polygon

Nach dem Import in das Projekt wird jedoch festgestellt, dass dieses Viereck durch eine andere Diagonale unterbrochen wird und dass eines der Dreiecke entweder im Allgemeinen entartet ist oder diesem nahe kommt.


Ein Polygon in Unity mit einem Dreieck in der Nähe eines entarteten Dreiecks (das rechte Dreieck ist von einem Segment kaum zu unterscheiden).

Der Grund für die Probleme, die mit der Entartung von Polygonen verbunden sind, sind die Fehler bei Gleitkommaberechnungen sowie die Besonderheiten der Pixelinterpolation während des Renderns. Was zum Teufel passiert mit solchen Dreiecken: Sie zucken, jeder Rahmen ändert seine Farbe. Die extrem kleine Querschnittsabmessung führt zu Schwierigkeiten bei der Lichtverarbeitung, weshalb Teile dynamischer Objekte möglicherweise flackern. Und im Nichtdeterminismus des Backens der Beleuchtungskarte gibt es auch nichts Gutes.

Ich bin ein 3D-Paket, wie ich es sehe




Bei der 3D-Modellierung gibt es häufig einen Unterschied zwischen der tatsächlichen Anzahl der Scheitelpunkte und ihrer Anzahl in einem 3D-Paket. Das Wesentliche des Problems liegt in den Informationen, die für die Verarbeitung durch die Grafikkarte erforderlich sind. Die Datenstruktur für den Scheitelpunkt ist vordefiniert und enthält die Positions-, Normal-, Tangenten- und Textur-Scan-Koordinaten für jeden Kanal und jede Farbe. Das heißt, zwei Normalen können nicht in einen Scheitelpunkt verschoben werden.

Für einige Künstler ist es nicht immer offensichtlich, dass der Peak nicht nur durch seine Position bestimmt wird. Modellierer kennen die Konzepte von harten / weichen Kanten und UV-Nähten gut , aber nicht jeder versteht, wie sie programmgesteuert implementiert werden. Darüber hinaus sind 3D-Pakete verwirrend, bei denen im Standardmodus die Anzahl der Scheitelpunkte als Anzahl der eindeutigen Positionen angezeigt wird.

Das übliche Würfelprimitiv wird also geometrisch durch 8 Eckpunkte dargestellt. Um jedoch die Lichtreflexion von jeder Seite korrekt zu übertragen und die Textur korrekt anzuwenden, sind in jeder Ecke des Würfels 3 Eckpunkte mit derselben Position, jedoch unterschiedliche Normalen und Texturkoordinaten erforderlich, da 3 Kanten in jeder Ecke zusammenlaufen. Ein kleiner Dokumentationsblock war diesem Moment gewidmet. Dort sehen Sie Beispiele.


Mixer- Würfel-Metriken


Unity Cube-Metriken

Hör auf!


Angesichts dieser und ähnlicher Probleme haben wir beschlossen, beim Import in ein Unity- Projekt ein Modellanalyse- und Validierungswerkzeug zu erstellen. Mit anderen Worten, ein benutzerdefinierter Validator, der auf Anfrage "Eat!" Antwort: „Ich werde nicht! Wiederholen “- oder spucken Sie eine Reihe von Warnungen und Werten verschiedener Parameter aus, um zu benachrichtigen, dass etwas für ihn nicht gut ist.

Zur Analyse und Verifizierung haben wir folgende Funktionen entwickelt:

  • Zählen der Anzahl eindeutiger Positionen von Scheitelpunkten, farbigen Scheitelpunkten, harten Kanten , UV-Nähten ;
  • Berechnung der Axis-Aligned Bounding Box (AABB) und ihrer Mitte;
  • Bestimmung der Ausgabe der Koordinaten des UV- Scans über den Bereich von 0,0–1,0 hinaus;
  • Textur-Overlay-Definition;
  • Überprüfen des Textur-Scans auf Angemessenheit der angegebenen Pixeleinrückung für eine bestimmte Texturauflösung.

Was gibt uns das?

Das Zählen der Anzahl eindeutiger Scheitelpunktpositionen, harter Kanten, UV-Nähte und farbiger Scheitelpunkte ist erforderlich, um zu überprüfen, ob das Modell des Künstlers in Unity importiert wurde. Mit dieser Funktion können Sie auch die Einhaltung der Anforderungen zur Optimierung des Modells überwachen (z. B. damit die Anzahl der Scheitelpunkte einen bestimmten Wert nicht überschreitet). Aufgrund der gleichen Besonderheit von 3D-Paketen, die tatsächlich die Anzahl der eindeutigen Positionen anzeigen, gibt es Fälle, in denen die Metrik der Anzahl der Scheitelpunkte im Modelleditor diese Einschränkung erfüllt. Nach dem Hinzufügen der Datei zum Projekt kann sich jedoch herausstellen, dass dies nicht der Fall ist.

Berechnung von AABB und seinem Zentrum - ermöglicht es Ihnen, die Verschiebung des Modells relativ zum Beginn seines eigenen Koordinatensystems zu bestimmen. Dies ist für die vorhersehbare Positionierung von Assets erforderlich, die in der Szene initialisiert werden, während die Anwendung ausgeführt wird. Der AABB des Gebäudes sollte also in guter Weise minY = 0 und einen an der Decke befestigten Kronleuchter haben - maxY = 0.







Verlassen Sie die Koordinaten der Eckpunkte des UV-Scans für den Bereich von 0,0 bis 1,0 - in den meisten Fällen (z. B. wenn die Textur auf dem Modell gekachelt werden soll) wird dies bereitgestellt. Oft wird dieser Ansatz verwendet, um in der Szene eine Vielzahl von kleinen Objekten mit geringer Detailgenauigkeit (Vegetation) und / oder in der Ferne befindlichen Objekten darzustellen sowie große homogene Objekte (Gebäude) zu kacheln. Beim Kacheln werden die Koordinatenwerte eines bestimmten UV- Kanals einfach auf Shader-Ebene vom gesamten Teil abgeschnitten, wenn der Wrap-Modus der Textur auf Wiederholen eingestellt ist .

Stellen Sie sich jetzt vor, Sie haben die Textur in einen Satin gelegt (und mit einer Decke bedeckt: 3). Bereits konvertierte Koordinaten, die dem Atlas entsprechen (x * Skala + Versatz), werden zum Shader geliefert. Dieses Mal wird es höchstwahrscheinlich kein ganzes Teil geben und es wird nichts zu beschneiden sein, und das Modell wird auf die Textur eines anderen klettern (die Decke stellte sich als klein heraus). Dieses Problem wird auf zwei Arten gelöst.

Beim ersten wird davon ausgegangen, dass Sie den ganzzahligen Teil vorab an den Sweep-Koordinaten schneiden. In diesem Fall besteht die Möglichkeit, dass sich Polygone überlappen, worauf wir weiter unten eingehen werden.

Die zweite basiert auf der Tatsache, dass Texturkacheln von Natur aus eine Optimierungsmethode sind. Niemand verbietet Ihnen, die Größe zu erhöhen und das gewünschte Stück für das gesamte Modell zu probieren. Auf diese Weise wird der nutzbare Raum des Atlas jedoch ineffizient genutzt.



Überlagerungen in einem Textur-Scan sind oft auch nicht zufällig: Sie werden benötigt, um Texturbereiche effektiv zu nutzen. Es kommt vor, dass ein Neuling einen Fehler macht, ein hochrangiger Kamerad ihn sieht, ein starkes Wort ausspricht und ein Neuling das nicht mehr tut. Es kommt jedoch vor, dass die Überlagerung so klein ist und sich an einem so unerwarteten Ort befindet, dass der ältere Kamerad sie möglicherweise nicht bemerkt.

Im experimentellen Team kommen Fehler, die beim Basis-Scan nicht erkannt wurden, etwas häufiger als nie in das Projekt. Eine andere Sache ist, wenn sich die Bedingungen für die Verwendung von vorgefertigten Inhalten ändern.

Ein Beispiel. Wir haben mit einer Reihe von Modellen für dynamische Objekte im Spiel gearbeitet. Da es für sie kein Problem gab, Licht zu backen, waren Überlagerungen im UV- Scan zulässig.


Ein Beispiel für einen einfachen UV- Scan mit Überlagerungen (rot dargestellt)

Dann haben wir uns jedoch entschieden, diese Modelle nicht als dynamische Modelle zu verwenden, sondern sie als statisches Dekor auf einer Ebene zu platzieren. Wie Sie wissen, wird zur Optimierung die Beleuchtung statischer Objekte in einer Szene in einem speziellen Atlas gebacken. Diese Modelle hatten keinen separaten UV2- Kanal für die Beleuchtungskarte , und die Qualität des automatischen Generators in Unity passte nicht zu uns. Daher entschieden wir uns, den grundlegenden Textur-Scan so oft wie möglich zum Backen zu verwenden.

Hier gab es offensichtliche Probleme mit der Richtigkeit der Beleuchtung. Offensichtlich sollten die Strahlen, die in eine Statue im Auge eintreten, am fünften Punkt auf dem Hinterkopf keine Blendung erzeugen.


Falsch gebackene Modellbeleuchtung (links) und korrigiert (rechts)

Beim Erstellen einer Beleuchtungskarte versucht Unity hauptsächlich, den UV2- Kanal zu verwenden. Wenn es leer ist, wird das Haupt- UV verwendet . Wenn dieses leer ist, entschuldigen Sie mich, aber dies ist eine Ausnahme. Es gibt zwei Möglichkeiten, Modelle in eine Lightmap zu backen, ohne zuvor UV2 in Unity vorbereitet zu haben .

Als erstes bietet Unity eine automatische UV2- Generierung basierend auf der Modellgeometrie. Dies ist schneller als manuell. Außerdem kann dieses Tool mithilfe mehrerer Parameter konfiguriert werden. Trotzdem ist die resultierende Überlappung von Helldunkel für sehr detaillierte Objekte aufgrund von Nähten und Leckagen an den falschen Stellen oft unbefriedigend, und die Verpackung von Teilen eines solchen Sweeps ist nicht die effektivste.



Die zweite Möglichkeit besteht darin, zum Backen einen einfachen UV- Scan zu verwenden. Eine sehr attraktive Option, da bei der Arbeit mit einem Textur-Scan die Wahrscheinlichkeit eines Fehlers geringer ist als bei der Arbeit mit zwei. Aus diesem Grund versuchen wir, die Anzahl der Modelle mit Überlagerungen im Basis- UV zu minimieren. Erstellte Tools helfen uns dabei.

Das Überprüfen des Textur-Scans auf Angemessenheit der angegebenen Pixeleinrückung bei einer bestimmten Texturauflösung ist eine genauere UV- Validierung basierend auf der Rasterung. Mehr zu dieser Methode wird im nächsten Artikel der Reihe beschrieben.

Zusammenfassend. Natürlich ist es fast unmöglich, alle Nuancen zu verfolgen: Manchmal muss man sich mit der Unvollkommenheit des Ergebnisses abfinden, um die Aufgabe rechtzeitig zu erledigen. Die Identifizierung auch nur eines Teils solcher Mängel ermöglicht es jedoch, die Entwicklung des Projekts zu beschleunigen und seine Qualität zu verbessern.

Source: https://habr.com/ru/post/de447820/


All Articles