Erstellen von interaktivem Gras in Unreal Engine


Bis vor kurzem wurde Gras in Spielen normalerweise durch eine Textur auf dem Boden angezeigt, anstatt durch das Rendern einzelner Stängel. Mit zunehmender Eisenleistung wurde es jedoch möglich, Gras zu rendern. Gute Beispiele für dieses Rendering sind in Spielen wie Horizon Zero Dawn und The Legend of Zelda: Der Atem der Wildnis zu sehen . In diesen Spielen kann der Spieler die Graswiesen durchstreifen, und was noch wichtiger ist, das Gras reagiert auf die Aktionen des Spielers.

Glücklicherweise ist die Erstellung eines solchen Systems nicht sehr schwierig. In der Tat wird der Artikel Ihnen genau das beibringen! In diesem Tutorial lernen Sie Folgendes:

  • Erstellen Sie ein Vektorfeld mit einem Szenenerfassungs- und Partikelsystem
  • Biegen Sie Gras von einem Spieler basierend auf einem Vektorfeld
Hinweis: In diesem Lernprogramm wird davon ausgegangen, dass Sie die Grundlagen der Arbeit mit Unreal Engine bereits kennen. Wenn Sie Unreal Engine noch nicht kennen, lesen Sie unsere zehnteilige Reihe von Unreal Engine- Tutorials für Anfänger . Lesen Sie insbesondere das Tutorial zu Partikelsystemen , um zu erfahren, wie Sie Cascade in diesem Tutorial verwenden.
Hinweis: Dieses Lernprogramm ist Teil einer Reihe von drei Lernprogrammen zum Arbeiten mit Renderzielen:

An die Arbeit gehen


Beginnen wir mit dem Herunterladen der Materialien für dieses Tutorial (Sie können sie hier herunterladen). Entpacken Sie sie, gehen Sie zu InteractiveGrassStarter und öffnen Sie InteractiveGrass.uproject . Sie sehen ein kleines Grasfeld, das das Thema dieses Tutorials sein wird. Ich habe auch ein Widget erstellt, um das Renderziel der Szenenaufnahme anzuzeigen.



Bevor Sie beginnen, sollten Sie das Tutorial zum Erstellen von Fußabdrücken im Schnee lesen , da ich einige Informationen überspringen werde. Es ist zu beachten, dass in diesem Tutorial auch Erfassung und Projektion verwendet werden. Um Zeit zu sparen, habe ich eine Blaupausenerfassung vorbereitet, ähnlich der Blaupause aus dem Tutorial auf den Spuren im Schnee.

Schauen wir uns zunächst einen anderen Weg an, um interaktives Gras zu erstellen. Am häufigsten werden die Koordinaten des Spielers auf das Grasmaterial übertragen und das Gras mit einer Kugelmaske in einem bestimmten Radius vom Spieler gebogen.

Obwohl dieser Ansatz recht gut ist, lässt er sich nicht gut skalieren, wenn wir dem Gras mehr Akteure hinzufügen möchten. Für jeden hinzugefügten Akteur müssen Sie dem Material einen weiteren Koordinatenparameter und eine sphärische Maske hinzufügen. Eine skalierbarere Methode ist die Verwendung eines Vektorfeldes .

Was ist ein Vektorfeld?


Ein Vektorfeld ist nur eine Textur, von der jedes Pixel einer Richtung entspricht. Wenn Sie früher mit Stream-Maps gearbeitet haben, sind diese ähnlich. Anstatt UV zu verschieben, verwenden wir den Kontakt Weltpositionsversatz , um die Scheitelpunkte zu verschieben. Im Gegensatz zur Lösung mit einer sphärischen Maske reicht es für die Materialien aus, das Vektorfeld nur einmal abzutasten, um die Biegerichtung zu erhalten.

Lassen Sie uns herausfinden, wie Sie Anweisungen in einer Textur speichern können. Schauen Sie sich dieses Raster an:


Angenommen, der rote Punkt ist das Objekt, das wir verschieben möchten. Wenn wir es in die untere rechte Ecke verschieben, welcher Vektor bezeichnet dann diese Bewegung? Wenn Sie geantwortet haben (1, 1) , dann haben Sie Recht! Wie Sie wahrscheinlich wissen, können Sie Vektoren auch als Blumen darstellen und sie so in der Textur speichern. Fügen wir diesen Vektor in den unwirklichen Farbwähler ein und sehen, welche Farbe er zurückgibt.


Wie Sie sehen können, kehrt die Richtung (1, 1) gelb zurück. Das heißt, wenn wir das Gras in Richtung der positiven XY-Achsen biegen wollen, müssen wir diese Texturfarbe verwenden. Schauen wir uns nun die Farben aller Vektoren an.


Das untere rechte Quadrat sieht ziemlich gut aus, da es auf beiden Achsen Farbverläufe aufweist. Dies bedeutet, dass wir jeden Vektor in diesem Quadranten als Farbe speichern können, da jeder Vektor eine eindeutige Farbe hat.

Bei den anderen drei Quadranten gibt es jedoch ein Problem. Wir haben nur einen Gradienten entlang einer Achse oder überhaupt keinen Gradienten. Dies bedeutet, dass mehrere Vektoren dieselbe Farbe haben. Zum Beispiel können wir nicht zwischen den Vektoren (-1, 1) und (0, 1) unterscheiden .

Diese drei Quadranten haben nicht für jeden Vektor eindeutige Farben, da wir Farben nur mit Werten von 0 bis 1 darstellen können. Diese drei Quadranten verwenden jedoch negative Werte außerhalb dieses Bereichs.

Die Lösung besteht darin, die Vektoren so zu verteilen, dass sie alle in das Intervall von 0 bis 1 passen. Dies kann durch Multiplizieren des Vektors mit 0,5 und Addieren von 0,5 erfolgen . Hier ist eine Visualisierung dessen, was wir bekommen:


Jetzt hat jeder Vektor eine eindeutige Farbe. Wenn wir es für Berechnungen verwenden müssen, verteilen wir es einfach wieder auf das Intervall von -1 bis 1. Hier sind einige Farben und die entsprechenden Anweisungen nach der Umverteilung:

  • (0, 0): negatives X und Y.
  • (0,5, 0,5): keine Bewegung
  • (0, 1): negatives X und positives Y.
  • (1, 0): positives X und negatives Y.

Lassen Sie uns nun lernen, wie Sie in Unreal ein Vektorfeld erstellen.

Erstellen eines Vektorfeldes


Im Gegensatz zum Erstellen von Spuren im Schnee werden wir die Erfassung der Form von Objekten nicht durchführen. Stattdessen malen wir mit Pinseln auf das Renderziel. Dies sind nur Bilder des ausgewählten Vektorfeldes. Ich werde sie Richtungsbürsten nennen.

Anstatt mit Blunts auf ein Renderziel zu zeichnen, können wir Partikel verwenden . Die Partikel zeigen einen Richtungspinsel an, der vom Player ausgegeben wird. Um ein Vektorfeld zu erstellen, müssen wir nur die Szenenerfassung verwenden und nur Partikel erfassen. Der Vorteil dieser Methode ist, dass das Erstellen von Traces sehr einfach ist. Darüber hinaus können Sie auf einfache Weise Eigenschaften wie die Speicherdauer von Tracks und deren Größe verwalten. Darüber hinaus erzeugen Partikel vorübergehend dauerhafte Spuren, da sie vorhanden sind, nachdem sie den Erfassungsbereich verlassen und dorthin zurückgekehrt sind.

Im Folgenden finden Sie einige Beispiele für Richtungsbürsten, die wir verwenden können, sowie deren Auswirkungen auf Gras. Beachten Sie, dass im folgenden Beispiel die Partikel unsichtbar sind.


Erstellen Sie zunächst ein Material, das einen Richtungspinsel anzeigt.

Material für Anweisungen erstellen


Es gibt zwei Möglichkeiten, einen Richtungspinsel zu erstellen:

  1. Mathematisch: Richtungen und Form sind im Material festgelegt. Der Vorteil besteht darin, dass keine Software von Drittanbietern erforderlich ist und sich für einfache Formulare eignet.
  2. Normale Kartenkonvertierung : Erstellen Sie eine normale Karte mit den gewünschten Richtungen und Formen. Um die Karte in ein geeignetes Vektorfeld umzuwandeln, reicht es aus, den blauen Kanal zu entfernen. Der Vorteil dieser Methode ist, dass Sie sehr einfach komplexe Formen erstellen können. Unten finden Sie ein Beispiel für einen Pinsel, der sich nur schwer mathematisch erstellen lässt.


Für dieses Tutorial erstellen wir einen Pinsel mathematisch. Gehen Sie zum Ordner Materialien und öffnen Sie M_Direction . Beachten Sie, dass für dieses Material das Schattierungsmodell Unlit ausgewählt ist. Dies ist wichtig, da die Erfassung einer Szene Partikel erfassen kann, ohne sie zu beeinflussen.

Um dies nicht zu komplizieren, erstellen wir ein Material, das bewirkt, dass sich das Gras vom Zentrum des Partikels wegbewegt. Erstellen Sie dazu das folgende Schema:


Jetzt müssen wir neu verteilen. Fügen Sie dazu die ausgewählten Knoten hinzu und verbinden Sie alles wie folgt:


Geben wir dem Pinsel nun eine runde Form. Fügen Sie dazu die ausgewählten Knoten hinzu:


RadialGradientExponential steuert die Größe und Schärfe des Kreisumfangs. Durch Multiplizieren mit der Partikelfarbe können Sie die Opazität von Partikeln aus dem Partikelsystem steuern. Ich werde dies im nächsten Abschnitt genauer diskutieren.

So sieht der Pinsel aus:


Klicken Sie auf Übernehmen und schließen Sie das Material. Nachdem wir das Material erstellt haben, ist es Zeit, sich auf ein System von Partikelspuren einzulassen.

Erstellen eines Systems von Partikelspuren


Gehen Sie zum Ordner " ParticleSystems " und öffnen Sie PS_GrassTrail . Um Zeit zu sparen, habe ich bereits alle notwendigen Module erstellt.


So wirkt sich jedes Modul auf die Grasabdrücke aus:

  • Spawn: Die Häufigkeit der Erstellung beeinflusst die Glätte der Tracks. Wenn die Spuren intermittierend aussehen, sollten Sie die Häufigkeit der Erstellung erhöhen. In diesem Tutorial behalten wir den Standardwert (20) bei.
  • Lebensdauer: Die Lebensdauer des Pfades, bis das Gras wieder in seinen ursprünglichen Zustand zurückkehrt
  • Anfangsgröße: Trace-Größe
  • Farbe über die Lebensdauer: Da wir im Material Partikelfarbe verwenden, können Sie hier die Deckkraft steuern. Sie können auch die Alpha-Kurve ändern, um das Verschwinden der Spur zu steuern. Sie können beispielsweise das lineare Verschwinden, das Ein- und / oder Aussteigen auswählen. In diesem Tutorial behalten wir die Standardeinstellung bei, d. H. Den linearen Verlust.
  • Sperrachse: Dient zum Richten von Partikeln auf die Szenenaufnahme
  • Anfangsrotation: Wird verwendet, um sicherzustellen, dass die Partikel entlang der richtigen Achsen ausgerichtet sind (mehr dazu weiter unten).

Zuerst müssen wir das Material einstellen. Wählen Sie das erforderliche Modul aus und setzen Sie Material auf M_Direction . Stellen Sie den Sortiermodus auch auf PSORTMODE Age Newest First .


In diesem Sortiermodus können Sie neue Partikel über alte rendern. Wenn dies nicht getan wird, wirken sich keine neuen, sondern alte Partikel auf das Gras aus.

Als nächstes folgt die Dauer der Ablaufverfolgung. Wählen Sie das Lifetime- Modul aus und setzen Sie Constant auf 5 . Dank dessen verschwindet die Spur innerhalb von fünf Sekunden.


Kommen wir nun zur Größe der Spur. Wählen Sie das Modul Anfangsgröße und setzen Sie die Konstante auf (150, 150, 0) . Aus diesem Grund bedeckt jedes Partikel eine Fläche von 150 × 150.


Jetzt müssen wir dafür sorgen, dass die Szene erfasst wird. Da die Szene von oben aufgenommen wird, sollten die Partikel in Richtung der positiven Z-Achse schauen. Wählen Sie dazu das Modul Lock Axis und setzen Sie die Lock Axis Flags auf Z.


Schließlich müssen wir die Rotation der Partikel einstellen. Derzeit sind die Pinselfarben nicht an der Richtung ausgerichtet, die sie darstellen. Dies geschah, weil das Partikelsystem standardmäßig mit einer Drehung von 90 Grad angewendet wird. Um dies zu beheben, wählen Sie das Modul Initial Rotation aus und setzen Sie den Wert Constant auf -0,25 . Dadurch werden die Partikel um 90 Grad gegen den Uhrzeigersinn gedreht.


Und das ist alles, was wir für das Partikelsystem brauchen. Schließen wir es also.

Als nächstes müssen wir ein Partikelsystem an das anhängen, was Spuren erzeugen soll. In unserem Fall müssen wir es dem Charakter des Spielers hinzufügen.

Anbringen des Partikelsystems


Gehen Sie zu Characters \ Mannequin und öffnen Sie BP_Mannequin . Erstellen Sie als Nächstes die Partice System- Komponente und nennen Sie sie GrassParticles .


Als nächstes müssen wir ein Partikelsystem definieren. Gehen Sie zum Detailfenster und setzen Sie Partikel \ Vorlage auf PS_GrassTrail .


Es wäre seltsam, wenn der Spieler den Titel im Spiel sehen könnte. Es lohnt sich also, ihn zu verstecken. Aktivieren Sie dazu Rendering \ Owner No See .


Da das Partikelsystem an den Spieler (Besitzer) angeschlossen ist, sieht der Spieler es nicht, aber es ist für alles andere sichtbar.

Klicken Sie auf Kompilieren und dann auf Wiedergabe . Beachten Sie, dass Partikel nicht für die Kamera des Players angezeigt werden, sondern auf dem Renderziel angezeigt werden.


Bisher ist die Szenenaufnahme so eingestellt, dass alles erfasst wird. Dies passt natürlich nicht zu uns, da nur Partikel das Gras beeinflussen. Im nächsten Abschnitt erfahren Sie, wie Sie nur Partikel erfassen.

Partikelerfassung


Wenn wir jetzt Partikel einfangen, werden wir in Bereichen ohne Partikel unnötige Biegungen durchführen. Dies liegt daran, dass die Hintergrundfarbe des Renderziels schwarz ist. Biegung tritt auf, weil Schwarz eine Bewegung in Richtung der negativen XY-Achsen bezeichnet (nach Umverteilung). Damit die leeren Bereiche keine Bewegung enthalten, müssen wir das Hintergrundziel rendern (0,5, 0,5, 0) . Der einfachste Weg, dies zu tun, besteht darin, ein riesiges Flugzeug zu erstellen und es am Player zu befestigen.

Erstellen Sie zunächst Material für den Hintergrund. Kehren Sie zum Inhaltsbrowser zurück und öffnen Sie Materials \ M_Background . Verbinden Sie dann die Konstante (0,5, 0,5, 0) mit Emissive Color .


Hinweis: Wie bei Partikelmaterial muss jedes Material, das wir erfassen, ein unbeleuchtetes Shader- Modell haben.

Klicken Sie auf Übernehmen und schließen Sie das Material. Gehen Sie zurück zu BP_Mannequin und erstellen Sie eine neue Ebenenkomponente . Nennen Sie es Hintergrund .


Legen Sie als Nächstes die folgenden Eigenschaften fest:

  • Ort: (0, 0, -5000). Wir platzieren die Ebene so niedrig, dass sie keine Partikel überlappt.
  • Maßstab: (100, 100, 1). Wir skalieren also auf eine Größe, die ausreicht, um den gesamten Erfassungsbereich abzudecken.
  • Material: M_Background


Wie bei Partikeln wäre es seltsam, wenn der Spieler ein riesiges gelbes Flugzeug darunter sehen würde. Um es auszublenden, aktivieren Sie Rendering \ Owner No See .


Nachdem wir den Hintergrund eingerichtet haben, ist es Zeit, die Partikel einzufangen. Wir können dies tun, indem wir der Nur-Show-Liste der Szenenaufnahme ein Partikelsystem hinzufügen. Dies ist eine Liste von Komponenten, die die Szenenaufnahme erfassen.

Verwenden der Nur-Show-Liste


Bevor wir zur Nur-Show-Liste hinzufügen können, müssen wir einen Weg finden, um alle Akteure zu finden, die das Gras beeinflussen. Eine Möglichkeit, sie zu erhalten, ist die Verwendung von Tags . Tags sind einfache Zeichenfolgen, die Akteuren und Komponenten zugewiesen werden können. Anschließend können Sie den Knoten Alle Akteure mit Tag abrufen verwenden, um alle Akteure mit dem entsprechenden Tag abzurufen.

Da der Schauspieler des Spielers das Gras beeinflussen muss, benötigt er ein Tag. Klicken Sie zum Hinzufügen eines Tags auf die Schaltfläche Class Defaults . Erstellen Sie dann ein neues Tag in Actor \ Tags und nennen Sie es GrassAffector .


Da nur Komponenten in die Nur-Show-Liste übertragen werden können, müssen wir den Komponenten , die sich auf das Gras auswirken, Tags hinzufügen. Wählen Sie die GrassParticles- Komponente aus und fügen Sie ein neues Tag im Abschnitt Tags hinzu . Nennen Sie es auch GrassAffector (dieses Tag muss nicht verwendet werden). Wiederholen Sie dies für die Hintergrundkomponente .


Jetzt müssen wir grasbeeinflussende Komponenten zur Nur-Show-Liste der Szenenerfassung hinzufügen. Klicken Sie auf Kompilieren und schließen Sie BP_Mannequin . Öffnen Sie dann Blueprints \ BP_Capture . Gehen Sie zu Event BeginPlay und fügen Sie die markierten Knoten hinzu. Stellen Sie außerdem sicher, dass die markierten Stifte angeschlossen sind.


Diese Schaltung durchläuft alle Akteure mit dem GrassAffector- Tag. Danach prüft sie, ob der Schauspieler Komponenten mit diesem Tag hat, und fügt sie der Nur-Show-Liste hinzu.

Als nächstes müssen wir der Szenenaufnahme mitteilen, dass nur die Nur-Show-Liste verwendet werden soll. Wählen Sie die SceneCapture- Komponente aus und gehen Sie zum Abschnitt Scene Capture . Stellen Sie den primitiven Rendermodus auf ShowOnly List ein .


Klicken Sie auf Kompilieren und schließen Sie den Entwurf. Wenn Sie auf Wiedergabe klicken, sehen Sie, dass das Renderziel jetzt nur Partikel und die Hintergrundebene erfasst.


Im nächsten Abschnitt kommen wir zu dem, was wir erwartet haben. Es ist Zeit, dem Gras das Biegen beizubringen!

Biegen Sie das Gras


Zuerst müssen wir das Renderziel auf das Gras projizieren. Gehen Sie zum Ordner Materialien und öffnen Sie M_Grass . Erstellen Sie dann die unten gezeigten Knoten. Setzen Sie die Textur auf RT_Capture .


Da wir die Farben im Intervall von 0 bis 1 neu verteilt haben, müssen wir vor der Verwendung die Farben im Intervall von -1 bis 1 neu verteilen. Fügen Sie dazu die hervorgehobenen Knoten hinzu:


Jetzt, da wir die Biegerichtung haben, brauchen wir eine Möglichkeit, das Gras in diese Richtung zu drehen. Glücklicherweise gibt es dafür einen Knoten namens RotateAboutAxis . Lass es uns schaffen.


Beginnen wir mit dem Kontakt NormalizedRotationAxis . Wie der Name schon sagt, ist dies die Achse, um die sich der Scheitelpunkt dreht. Zur Berechnung benötigen wir nur ein Vektorprodukt der Biegerichtung um (0, 0, -1) . Dazu müssen wir die ausgewählten Knoten hinzufügen:


Wir müssen auch den Rotationswinkel angeben, dh den Betrag der Rotation des Scheitelpunkts relativ zum Rotationspunkt. Standardmäßig sollte der Wert zwischen 0 und 1 liegen, wobei 0 0 Grad und 1 360 Grad beträgt. Um den Drehwinkel zu erhalten, können wir die Länge der Biegerichtung multipliziert mit der maximalen Drehung verwenden.


Das Multiplizieren mit einer maximalen Drehung von 0,2 bedeutet, dass der maximale Drehwinkel 72 Grad beträgt.

Die Berechnung von PivotPoint ist etwas schwieriger, da ein einzelnes Grasnetz mehrere Stängel enthält. Dies bedeutet, dass wir so etwas wie den Knoten Objektposition nicht verwenden können, da er für alle Grashalme einen einzelnen Punkt zurückgibt.

Idealerweise sollten Sie einen 3D-Editor eines Drittanbieters verwenden, um Drehpunkte in UV-Kanälen zu speichern. In diesem Tutorial nähern wir uns jedoch nur dem Drehpunkt. Dies kann durch Bewegen von oben nach unten bis zu einem bestimmten Versatz erfolgen.


Fügen Sie dazu die ausgewählten Knoten hinzu:


In diesem Tutorial ist Gras ungefähr 80 Einheiten hoch, daher habe ich diesen Wert für PivotOffset festgelegt .

Als nächstes müssen wir zwei Masken ausführen. Die erste Maske stellt sicher, dass sich die Wurzel des Stiels nicht bewegt. Die zweite Maske stellt sicher, dass kein Vektorfeld auf Gras außerhalb des Erfassungsbereichs wirkt.

Maskierung


In diesem Tutorial habe ich die Farben der Grasoberseiten so eingestellt, dass die unteren Scheitelpunkte schwarz und die oberen Scheitelpunkte weiß sind.


Um die Wurzeln zu maskieren, multiplizieren wir einfach das Ergebnis von RotateAboutAxis mit dem Vertex Color- Knoten.


Um Gras außerhalb des Erfassungsbereichs zu maskieren, multiplizieren wir das vorherige Ergebnis mit dem ausgewählten Knoten:


Klicken Sie auf Übernehmen und schließen Sie das Material. Klicken Sie auf " Spielen" und rennen Sie durch das Gras, um Fußspuren zu hinterlassen!


Wohin als nächstes?


Das fertige Projekt kann hier heruntergeladen werden .

Obwohl die im Lernprogramm gezeigte Methode für einfache Objekte wie Gras hervorragend geeignet ist, reicht sie nicht aus, wenn Objekte verwendet werden, die mehr Dynamik erfordern. Eine Teillösung des Problems besteht darin, die physischen Versionen des Laubes zu verwenden. Weitere Informationen finden Sie in diesem Beitrag über interaktives Laub.

Abschließend möchte ich Deathrey von der Unreal Engine-Community für den Tipp dieser Partikelmethode danken!

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


All Articles