Verfahrensstörung in der Kontrolle: Lehren aus der Abhilfemaßnahme

Auf der GDC in diesem Sommer sprach der hochrangige VFX-Künstler Remedy Johannes Richter darüber, wie prozedurale Zerstörung im neuesten Spiel des Studios, dem mystischen Actionspiel Control, implementiert wird.



In seinem Vortrag widmete er sich dem Grundprinzip der Konstruktion vieler In-Game-Effekte oder dem Prinzip der Granularität. Wie das Studio ein umfangreiches System realistischer Zerstörbarkeit implementiert hat, welchen Einschränkungen seiner eigenen Ressourcen und seiner Plattformleistung es ausgesetzt war, welche Optimierungen es vorgenommen hat und welche Lehren es daraus gezogen hat - weiter im Material.







Also zuerst zu den Herausforderungen, denen sich das Studio gestellt hat.



Das Spiel findet in einem Regierungsgebäude im brutalistischen Stil statt, das einige übernatürliche Merkmale wie bewegliche Wände aufweist.



Die Struktur des Hauptquartiers hätte glaubwürdig aussehen müssen, da es sich um eine Regierungsbehörde handelt, die Tausende von Servicemitarbeitern beschäftigt, die Routineaufgaben ausführen. Tische, Telefone, Tassen, MFPs - all dies sind die üblichen Attribute für einen Büroangestellten, die Sie am Arbeitsplatz erwarten, und durch ihre Anwesenheit helfen sie, die Geschichte dieses Ortes qualitativ zu erzählen. Brutalismus bedeutet Tonnen von Beton, aber nicht nur: Hier haben wir sowohl Holz als auch Glas, die den am besten geeigneten Look für ein spezielles Servicegebäude schaffen.







Wenn es um Zerstörung geht, muss man zuerst an Taktilität denken. Das Entwicklungsteam wurde beauftragt, eine reichhaltige interaktive Umgebung zu organisieren, die sofort das Gefühl erzeugt, mit fast allem darin interagieren zu können.







Offensichtlich war das Studio während seiner Arbeit bestimmten Einschränkungen ausgesetzt. Interaktionen mit Objekten mussten realistisch aussehen und sich realistisch anfühlen. Der Spieler sollte eine gewisse Handlungsfreiheit in Bezug auf Zerstörung haben, aber nicht unbegrenzt, da die Möglichkeiten des Spiels von der ultimativen Leistung der Plattformen, dem Speicher und den Anforderungen an künstliche Intelligenz abhängen. Gleichzeitig erwies sich das mit der Umsetzung der zerstörbaren Umgebung beauftragte Team als recht klein, was auch bei der Arbeit berücksichtigt werden musste.







Die Zerstörbarkeit im Spiel basiert also auf dem Prinzip der Granularität. Es ist auch die Basis für viele Spezialeffekte in der Kinematographie. Seine Bedeutung ist, dass die Natur nicht quantifiziert wird. Es ist eine durchgehende Leinwand, die aus einer Vielzahl von Objekten besteht - von groß bis klein, von großflächigen Feststoffen bis zu Staub und Rauch. Wenn etwas nicht auf dem Bildschirm angezeigt wird, funktioniert das gesamte Bild nicht.



In einer Spiel-Engine kann dieses Prinzip in drei verschiedenen Detailebenen implementiert werden. Objekte auf ihnen werden in Form von starren Körpern (starren Körpern), ihren Teilen, Teilen von Requisiten, Requisiten selbst und der Umwelt dargestellt. Letzteres ist in diesem Fall eine Art statisches Gitter, mit dem interaktive Objekte kollidieren können. Mesh-Partikel, feste Hierarchien und Materialabziehbilder geben Objekten mehr Details auf bestimmten Ebenen. Von festen Objekten gehen wir also zu ihren Fragmenten und dann zu Fragmenten über. Die letzte Schicht sind die Partikel selbst. Partikel-Sprites, Glutpartikel, Sand und mehr spielen eine große Rolle beim Füllen dieser Farbverläufe.







Der Screenshot oben zeigt eine statische Umgebung. Es sieht ziemlich leer aus, obwohl es hier einige Details gibt: Im Hintergrund sehen Sie beispielsweise das Geländer für die Treppe.







Es ist erstaunlich, wie sich die Wahrnehmung ändert, wenn wir den Raum mit Objekten füllen, mit denen wir direkt interagieren können.







Der Workflow in Remedy ist eigentlich ziemlich trivial. Die Umgebungskünstler stellen Level-Geometriemodule und Requisiten für die Montage bereit. Anschließend konfiguriert die VFX-Abteilung die Rigs und Animationen für die filmische Zerstörung. Schließlich wird das Ergebnis an Remedys eigenen Motor Northlight gesendet.



Es war notwendig, einen Ansatz zu wählen, wie alles funktionieren würde, und das Team entschied sich für einen prozeduralen.



Was bedeutet das?



Der prozedurale Ansatz ist die regelbasierte Verarbeitung und Interpretation von Daten.







Informationen über die Spielwelt werden durch Modelle dargestellt, die Metadaten zu den Materialien enthalten. So können Sie beispielsweise festlegen, dass die Sitze der Bank aus Stoff bestehen, die Basis aus Beton besteht und die Pflanzen tatsächlich Pflanzen sind. Nachdem Sie die Materialien definiert haben, können Sie für jede ein endliches Regelwerk formulieren, das die Reaktionen auf alle Aktionen bestimmt, die im Spiel ausgeführt werden können. Zum Beispiel, so dass beim Schießen von Pflanzen Blätter abfliegen, der Beton in Fragmente zerbricht und das Metallrohr deformiert wird und Wasser herausplatzt. Dann werden alle Daten an die Engine umgeleitet und sie reagieren bereits entsprechend auf jede Interaktion.







Warum also prozedurale Zerstörung?



Weil es notwendig war, schnell und konsequent Maßnahmen zu ergreifen, vorhersehbares Verhalten unter klar definierten Bedingungen. Es gibt Hunderte von Assets im Spiel. Im Bild oben sehen Sie alle Arten von Blöcken, aus denen Räume, Wände, Säulen, Treppen, Geländer und mehr bestehen. Darunter befinden sich verschiedene Requisiten: Tische, Stühle, Vasen, Pflanzen, Computer, Telefone. Um die Zerstörung einer solchen Vielzahl von Objekten umzusetzen, wurde ein Team von nur 1-3 Personen ausgewählt. Daher war es notwendig, die Muster vorzugeben, nach denen die Welt arbeitet: Wenn ein Objekt auf eine bestimmte Weise beeinflusst wird, ist es notwendig, dass es genau so bricht, wie es für die gewählte Methode zur Zerstörung eines bestimmten Materials vorgeschrieben ist.







Es war also notwendig, je nach Material ein bestimmtes Verhalten einzustellen. Wenn Sie also auf den Baum schießen, wird er in Stücke fliegen. Oder wenn Sie auf Glas schießen, würde es in Scherben zerbrechen. Gleichzeitig müssen sich Partikel und Abziehbilder in einer bestimmten Weise verhalten, je nachdem, woraus das Objekt besteht.







Jedes Material hat seine eigene Bruchgeometrie, die durch verschiedene Ebenen definiert wird. Im Beispiel sehen wir ein Stück Geländer, an dessen Basis Beton, dann eine Metallstütze und schließlich Holz sind. Von links nach rechts werden die Stufen angezeigt, wenn sie brechen:



  • Stufe A zeigt einen Bruch im Beton. Hier gibt es keine Abziehbilder, da es noch wenige Risse gibt. Es ist zu erkennen, dass der Träger leicht gebogen ist.
  • Stufe B. Das Metall ist weg, aber es bleiben mehr gebrochener Beton und Holz übrig.
  • C : , .


Stellen wir uns nun vor, wir treffen einen bestimmten Winkel eines Objekts - dann sollte es nicht vollständig brechen, sondern nur einen Teil davon.







In Control gibt es also feste Körper, die ein einzelnes Objekt sind. Es gibt aber auch Details, die durch Links verbunden sind. Dies sind die gleichen starren Körper, die eine sogenannte zusammengesetzte Kollision trennen kann.







Teile werden während der Initialisierung erstellt, haben einen gemeinsamen Collider und bewegen sich als ein Teil, bis sie brechen. Sie sind durch die Oberflächen miteinander verbunden, die sich berühren.







Sprechen wir über Verbindungen. Sie werden in einer geometrischen Hierarchie basierend auf Metadaten erstellt. Feststoffe sind durch eine Art Scharnier miteinander verbunden - zum Beispiel bei einer Tür oder einer Schublade. Sie können wiederum durch die Stärke des Impulses dynamisch zerstört werden.







Es gibt eine spezielle Zerstörungsphysik für Verbindungen. Sie brechen nicht mit dem Objekt - das heißt, wenn Sie ein Loch in die Tür schlagen, bleibt die Tür immer noch ein ganzes Objekt, das durch interne Verbindungen zusammengehalten wird. Wenn Sie also den Elternblock RB1 brechen, fällt die Tür nicht aus den Angeln: Ein Stück davon wird weiterhin an der Öffnung befestigt, ohne vom Aufprall betroffen zu sein. Und eine Tür mit einem Loch in der Mitte kann wie erwartet geschlossen und geöffnet werden. Daher wollten die Entwickler Situationen vermeiden, in denen Objekte vollständig brechen, unabhängig davon, wo und mit welcher Kraft der Schlag fiel, wie dies bei einigen Spielen der Fall ist.







Die proprietäre Simulation von Northlight führt die Zerstörungslogik aus und bestimmt, welche Ereignisse und Partikel darauf reagieren. Die NVIDIA-Physik-Engine modelliert dann die starren Körper und versucht, sie an die Einschränkungen des Spiels anzupassen.







Die Zerstörung selbst wird wie folgt realisiert. Wir haben eine Eingabegeometrie. Manchmal ist es notwendig, das Modell im Voraus vorzubereiten, die Klebegeometrie festzulegen und zu bestimmen, in welchen Fällen welche Teile brechen können. Die Modelle werden dann an Houdini gesendet und dort verarbeitet. Destruction in Houdini ist ein ziemlich umfangreiches HDA-Setup, das materialbasierte Reaktionen ausführt und Daten in den Speicher schreibt. Manchmal musste ich einige Physik-Metadaten manuell korrigieren und einstellen, um sicherzustellen, dass die Einstellungen korrekt waren, insbesondere wenn es um Verbindungen ging. Anschließend werden alle Daten an die Engine übertragen, wo sie zur Erstellung der Spielwelt verwendet werden.







Das Zerstörungswerkzeug in Houdini sieht ungefähr so ​​aus. Nehmen wir an, wir haben einen konkreten Block als Eingabe. Es muss ermittelt werden, welche Bereiche brechen können, und das Material eingestellt werden. In diesem Fall führt der Block eine Zerstörung gemäß den für Beton festgelegten Regeln durch, verwaltet ihn und erstellt unterschiedliche Hierarchien hinsichtlich des Renderns von Geometrie und Kollisionen. Dann müssen Sie sicherstellen, dass die Modellierung innerhalb des von Ihnen festgelegten Budgets und Stils erfolgt. Danach können Sie das Modell in die Engine exportieren.







Im Motor sieht es so aus. Sie haben eine Art Hierarchie, die Informationen zu den Ebenen A, B, C usw. enthält. Dazu gehören der Name des Materials, unabhängig davon, ob das Objekt statisch ist oder nicht, Daten zu Verbindungen, deren Typen usw. Die Hierarchie wird durch Ebenen dargestellt, und die physikalischen Eigenschaften unterscheiden sich je nach Materialname. Wenn der Name korrekt angegeben ist, wird die Physik von der Engine verarbeitet. Wir werden später über das Problem der Namen sprechen.







Oben ist ein solides Simulationsszenario dargestellt. Jesse schießt auf Objekte um sie herum und sie explodieren, wodurch die Physik der Zerstörung erkannt wird.







Da eine zerstörbare Umgebung ressourcenintensiv ist und Konsolen und PCs ihre eigenen Leistungsgrenzen haben, stand das Team vor der Aufgabe, das System so zu optimieren, dass die Geräte nicht überlastet werden.



Da es notwendig war, in ein bestimmtes Leistungsbudget zu passen, wurde ein Grenzwert von 200 aktiven Volumenkörpern auf dem Bildschirm festgelegt, sodass Objekte außerhalb des Bildschirms vollständig verschwanden.



Bei Ereignissen mit vielen sich schnell bewegenden Objekten kommt es zu einer Verzögerung der Kollisionen, sodass das System Zeit hat, alle Berechnungen durchzuführen.



Der Ruhemodus wurde auch für nicht verwendete Elemente implementiert. Wenn zum Beispiel ein Betonblock zu Boden fällt, erwartet niemand, dass er wie ein Ball springt - so dass er ziemlich schnell "einschlafen" kann. Dies gilt für viele Gegenstände im Spiel. Aus dem gleichen Grund können sie übereinander gestapelt werden und liegen auf die gleiche Weise bewegungslos.



Zusätzlich wurden die Lücken zwischen den Gegenständen mit Partikeln gefüllt. Wenn ein Objekt zerstört wird, bilden sich um ihn herum Staub oder Späne.







Alles im Spiel ist systematisch und ereignisgesteuert. Folgende Partikelereignisse existieren:



  • Kugelaufprall, der je nach Material zu unterschiedlichen Ergebnissen führt;
  • Unterbrechen der Verbindung zwischen zwei Teilen; In diesem Fall erfolgt eine Verschrottung, bei der Partikel freigesetzt werden.
  • vollständige Zerstörung eines Objekts, was zu seiner Auflösung in Partikel führt.






Das Obige zeigt den Prozess der Bearbeitung von Partikeln. Direkt im Spiel können Sie ein bestimmtes Partikelsystem platzieren und dann ändern. In diesem Fall ändert sich einfach die Häufigkeit der Funkenbildung. Interessanterweise können Sie es buchstäblich in Echtzeit ändern und sofort Feedback erhalten. Anschließend können Sie es erneut abspielen und sehen, wie der Effekt funktioniert. Auf diese Weise implementiert, können Sie mit einer schnellen Iterationsschleife solche Dinge polieren, bis sie korrekt angezeigt werden.







Ein weiteres Merkmal von Partikeln ist die Standardmodellierung. Von Zeit zu Zeit musste das Team signierte Distanzfelder (SDF) verwenden. Dank dessen konnte sichergestellt werden, dass keine Gegenstände durch den Boden fielen, was äußerst seltsam aussehen würde.







Im obigen Beispiel ist ein zerstörbares Objekt eine Symbiose aus Partikeln und einem Feststoff. Das sehen wir. Die Explosion erzeugt Staub in der Luft aufgrund zusätzlicher Partikelschichten, die die fehlenden Lücken im Granularitätsgradienten füllen.







Und die letzten Abziehbilder von Materialien, von denen es viele im Spiel gibt und die dynamisch generiert werden. Im Grunde sind es nur Texturen, die auf Objekte angewendet werden, um den Anschein von Zerstörung zu erwecken.



Wenn etwas kaputt geht, erscheint ein rissiger Aufkleber auf dem Gegenstand. Sie werden normalerweise in Houdini oder ähnlichem erstellt. In Control wird die Auswahl des gewünschten Aufklebers dynamisch basierend auf dem Material getroffen. Es half auch, einen ziemlich großen Teil der statischen Geometrie zu nutzen. Wie eingangs gezeigt wurde, gibt es immer viele statische Objekte um uns herum, die auch einem Einfluss unterliegen können, der berücksichtigt werden muss.







So sieht es aus. Wenn Sie den Boden brechen, bleibt das Polygon selbst gleich, aber mit dem Erscheinungsbild von Abziehbildern kann sich das Erscheinungsbild stark ändern. Es ist erwähnenswert, dass sie sehr wirtschaftlich und effektiv im Gebrauch sind.







Wir haben also Partikel, Feststoffe und Abziehbilder. In diesem Beispiel musste ich einige Tricks anwenden, da ein einfaches Explosionswerkzeug nicht so viele Abziehbilder erzeugen würde. Jetzt "wirft" Jesse einen Gegenstand, der eine Delle im Boden hinterlassen kann. Gleichzeitig bleibt der Boden ein statisches Polygon, aber dank der Abziehbilder bleiben Aufprallspuren darauf.







Lassen Sie uns auch das Thema benutzerdefinierte Requisiten ansprechen. Es gibt viele Gegenstände im Spiel, die verteilt werden müssen - Feuerlöscher, Computer, Lampen und dergleichen -, die nicht vollständig prozedural generiert werden können. Die Umgebungskünstler mussten die Effekte für jeden von ihnen noch manuell einstellen. Aufgrund ihrer Präsenz sieht die Welt im Spiel jedoch nur reicher und vielfältiger aus.



Welche Lektionen hat das Studio von Control gelernt?



Folgende Dinge sollten hier angesprochen werden:



  • ;
  • ;
  • ;
  • .






Das erste ist die Qualität der Geometrie. Inkonsistente Eingabegeometrie kann durch falsche Skalierung und Ausrichtung, aber auch durch falsche Materialzuordnungen verursacht werden. Manchmal kann die Netzqualität zu niedrig sein, was sich auch nachteilig auf das Ergebnis auswirkt. Es kommt auch vor, dass Sie beim Zerbrechen eines Objekts feststellen, dass sich nichts darin befindet, und dies ist falsch. Um solche Probleme zu vermeiden, müssen die Eingabedaten verbessert und die gesamte Geometrie-Pipeline standardisiert werden, damit das System beim Export warnt, wenn etwas die Kriterien nicht erfüllt und korrigiert werden muss. Dies würde dazu beitragen, ständige Rückkopplungsschleifen zwischen verschiedenen Abteilungen zu vermeiden, die genau nach Problemen suchen.



Darüber hinaus wäre es schön, integrierte Tools zu haben, mit denen Sie ein Objekt modellieren und sofort sehen können, wie es bei Zerstörung aussehen wird. Dies stellt natürlich die Herausforderung dar, mehr Tools mit besseren Schnittstellen zu erstellen, aber die Mühe lohnt sich.







Wir sind es gewohnt, verschiedenen Dingen Namen zu geben. Das Problem ist jedoch, dass diese Namen möglicherweise falsch sind. Zum Beispiel hat Control 17 verschiedene Bezeichnungen für das Material "Beton", und Sie können niemanden dafür verantwortlich machen, da es immer einen menschlichen Faktor gibt. Richters Rat ist, den Namensstandard ganz fallen zu lassen. Besser nur eine einzige Metadaten-API. Unabhängig davon, mit welchem ​​Werkzeug die Künstler die Requisiten erstellen, können auf diese Weise Daten ohne Zwischenschritte direkt von dort in die Engine exportiert werden.







Das nächste Tutorial ist hauptsächlich Houdini-spezifisch. Das Fazit ist, dass Sie, wenn Sie mit der Arbeit an etwas beginnen, diese häufig mehrmals wiederholen, einige Add-Ons erstellen und sicherstellen müssen, dass Sie die Quelldatei auch nach zweijähriger Arbeit öffnen können dass das Arbeitswerkzeug bereits 20 Mal gewechselt haben könnte. Dies bedeutet, dass Sie eine Art Standardisierung benötigen, um mit HDA arbeiten zu können. Daran arbeitet Remedy gerade: um sicherzustellen, dass alles korrekt verteilt ist, damit Sie nie eine Version des Tools verlieren und immer die Möglichkeit haben, das zu wiederholen, was Sie in der Vergangenheit getan haben.



Hierbei ist zu beachten, dass Sie beim Erstellen automatisierter Tools tatsächlich dieselbe Software verwenden, als würden Sie alles manuell ausführen. Und solange sie das gleiche Backend haben, sollte alles absolut konsistent sein.







Leistung und Test sind einige der wichtigsten Aspekte der Entwicklung.



Tests wurden in Remedy zunächst nicht automatisiert. Nach dem Hinzufügen neuer Objekte zur Ebene musste diese manuell durchlaufen werden, um zu überprüfen, ob alles ordnungsgemäß funktionierte. Aber dann änderte sich etwas an der Engine, das Backend änderte sich, etwas wurde optimiert und danach war ein erneuter Test erforderlich. Dies ist ziemlich gefährlich, da Sie sicherlich vergessen werden, etwas zu überprüfen. Kurz gesagt, nicht der beste Weg, was zu einer möglichen Anhäufung von Fehlern führen kann.



Der zweite Aspekt ist das Testen der Leistung. Remedy hat lange Zeit keine signifikanten Metriken wie Bildrate oder Rechenzeit gemessen. Daher wurden Leistungsprobleme oft zu spät entdeckt.







Hier kann zunächst die Leistungsindikatoren verbessert werden. Es ist notwendig zu bestimmen, welche Parametererhöhung das Spiel besser oder schlechter beeinflusst, um sich bei der Optimierung und Bestimmung eines Budgets, das nicht überschritten werden kann, darauf zu verlassen.



Darüber hinaus können Ihnen automatisierte Tests helfen, bei denen Sie auch die Leistung variieren können, um die Auswirkungen von Änderungen am Motor besser zu demonstrieren.







Sie können auch Leistungseinbußen identifizieren und Maßnahmen gegen diese ergreifen. Um dies beispielsweise so zu gestalten, dass bei Großereignissen einige Objekte mittlere Zerstörungsstufen umgehen - beispielsweise von Feststoffen, die direkt zu Partikeln gelangen.



Eine weitere Maßnahme ist die Zoneneinteilung des Gebiets in Abhängigkeit von der erwarteten Belastung. Diese Idee basiert auf der Tatsache, dass wir selbst bestimmen können, auf welchen Bereich bestimmte Gegenmaßnahmen anzuwenden sind, um sie nicht auf alle Vermögenswerte auf der Ebene anzuwenden, wenn dies nicht erforderlich ist. Wenn zum Beispiel bald Feinde mit Granaten rechtzeitig für Jesse eintreffen, wird es offensichtlich zu viel Zerstörung am Ort geben, und während ihres Angriffs kann der Prozess der Erzeugung von Zerstörung beschleunigt werden.



Infolgedessen möchte ich darauf hinweisen, dass das Remedy-Team eine monumentale Arbeit geleistet hat, aus der Sie viele Ideen zur Implementierung und Optimierung des Systems der prozeduralen Zerstörung der Umwelt gewinnen können.



All Articles