Der Wave Function Collapse-Algorithmus generiert Bitmaps, die der Eingabe-Bitmap lokal ähnlich sind.
Lokaler Schein bedeutet das
- (C1) Jedes Muster von NxN-Pixeln in der Ausgabe sollte mindestens einmal in der Eingabe auftreten.
- (Schwache Bedingung C2) Die Verteilung der NxN-Muster in der Eingabe sollte der Verteilung der NxN-Muster in einer signifikant großen Anzahl von Ausgabesätzen ähnlich sein. Mit anderen Worten, die Wahrscheinlichkeit, dass sich ein bestimmtes Muster in der Ausgabe trifft, sollte nahe an der Dichte solcher Muster in der Eingabe liegen.
In den Beispielen beträgt der Standardwert von N 3.
Der WaveFunctionCollapse (WFC) -Algorithmus initialisiert die Ausgabebitmap als einen vollständig nicht beobachtbaren Zustand, in dem der Wert jedes Pixels eine Überlagerung der Farben der Eingabebitmap ist (wenn das Eingabebild also Schwarzweiß ist, werden die nicht beobachtbaren Zustände als unterschiedliche Graustufen angezeigt). Die Koeffizienten dieser Überlagerungen sind reelle, keine imaginären Zahlen, daher verwendet der Algorithmus keine reale Quantenmechanik, sondern wurde von ihr inspiriert. Dann geht das Programm in den Beobachtungs-Ausbreitungszyklus:
- In jedem Beobachtungsstadium wird unter dem nicht beobachteten Raum die NxN-Region mit der niedrigsten Shannon-Entropie ausgewählt. Der Zustand dieses Bereichs kollabiert dann in Übereinstimmung mit den Koeffizienten und der Verteilung der NxN-Muster in den Eingabedaten zu einem Zustand der Sicherheit.
- In jeder Verteilungsstufe werden neue Informationen, die während des Zusammenbruchs der vorherigen Stufe erhalten wurden, entsprechend der Ausgabe verbreitet.
In jedem Stadium nimmt die Gesamtentropie ab, und am Ende erhalten wir einen vollständig beobachtbaren Zustand, der Zusammenbruch der Wellenfunktion endet.
Es kann vorkommen, dass während des Ausbreitungsprozesses alle Koeffizienten für ein bestimmtes Pixel gleich Null werden. Dies bedeutet, dass der Algorithmus zu einem Widerspruch gekommen ist und nicht weiter ausgeführt werden kann. Die Aufgabe zu bestimmen, ob eine gegebene Bitmap andere nichttriviale Bitmaps liefert, die die Bedingung (C1) erfüllen, ist NP-schwer, so dass es unmöglich ist, eine schnelle Lösung zu erstellen, die den Algorithmus immer vervollständigt. In der Praxis stößt der Algorithmus jedoch überraschend selten auf Widersprüche.
Der Wellenfunktionskollapsalgorithmus ist in
C ++ ,
Python ,
Kotlin ,
Rust ,
Julia ,
Haxe ,
JavaScript implementiert und für
Unity angepasst. Offizielle ausführbare Dateien können von
itch.io heruntergeladen oder
in einem Browser ausgeführt werden . WFC generiert Levels in
Bad North ,
Caves of Qud ,
mehreren kleineren Spielen sowie vielen Prototypen. Seine Schaffung führte zu einer
neuen Studie .
Weitere verwandte Arbeiten ,
Erklärungen ,
interaktive Demos ,
Anleitungen ,
Tutorials und
Beispiele finden Sie im Abschnitt
Ports, Gabeln und Ausgründungen .
Sehen Sie sich eine Demonstration des WFC-Algorithmus auf YouTube an:
https://youtu.be/DOQTr2Xmlz0Algorithmus
- Lesen Sie die eingehende Bitmap und zählen Sie die Anzahl der NxN-Muster.
- (optional) Ergänzen Sie die Musterdaten mit gedrehten und reflektierten Mustern.
- Erstellen Sie ein Array mit den Größen der Ausgabedaten (in der Quelle als „Welle“ bezeichnet). Jedes Element dieses Arrays gibt den Zustand eines Bereichs der Größe NxN in der Ausgabe an. Der Zustand des NxN-Bereichs ist eine Überlagerung von NxN-Mustern von Eingabedaten mit Booleschen Koeffizienten (dh der Zustand eines Pixels in der Ausgabe ist eine Überlagerung eingehender Farben mit reellen Koeffizienten). Der Koeffizient False bedeutet, dass das entsprechende Muster verboten ist, der Koeffizient true bedeutet, dass das entsprechende Muster noch nicht verboten ist.
- Initialisieren Sie die Welle in einem völlig unbeobachtbaren Zustand, dh in dem alle Booleschen Koeffizienten wahr sind.
- Wiederholen Sie die folgenden Schritte:
- Beobachtung:
- Finden Sie das Wellenelement mit minimaler Entropie ungleich Null. Wenn es keine solchen Elemente gibt (wenn alle Elemente eine Entropie von Null oder unbestimmt haben), schließen Sie den Zyklus (4) ab und fahren Sie mit Schritt (5) fort.
- Reduzieren Sie dieses Element gemäß seinen Koeffizienten und der Verteilung der NxN-Muster der Eingabedaten in einen sicheren Zustand.
- Verbreitung: Verbreitung der im vorherigen Beobachtungsschritt erhaltenen Informationen.
- Zu diesem Zeitpunkt haben alle Elemente der Welle entweder einen vollständig beobachtbaren Zustand (alle Koeffizienten außer einem sind gleich Null) oder befinden sich in einem widersprüchlichen Zustand (alle Koeffizienten sind gleich Null). Geben Sie im ersten Fall die Ausgabe zurück. Im zweiten Fall beenden Sie das Programm, ohne etwas zurückzugeben.
Kachelkartengenerierung
Der einfachste nicht triviale Fall des Algorithmus ist das Muster NxN = 1x2 (genauer NxM). Wenn wir es noch weiter vereinfachen und dabei nicht die Wahrscheinlichkeiten von Farbpaaren, sondern die Wahrscheinlichkeiten der Farben selbst beibehalten, erhalten wir ein sogenanntes „einfaches Kachelmodell“. Die Ausbreitungsphase in diesem Modell ist einfach die Ausbreitung einer Nachbarschaftsabhängigkeit. Es ist zweckmäßig, ein einfaches Kachelmodell mit einer Liste von Kacheln und ihren Nachbarschaftsdaten (Nachbarschaftsdaten können als eine große Anzahl sehr kleiner Stichproben betrachtet werden) anstelle einer abgetasteten Bitmap zu initialisieren.
GIF |
GIFVDie Listen aller möglichen Paare benachbarter Kacheln in praktischen Kachelsätzen können sehr lang sein. Um die Aufzählung zu verkürzen, habe ich ein Symmetriesystem für Kacheln implementiert. In diesem System muss jeder Kachel ihre Symmetrietyp zugewiesen werden.
Beachten Sie, dass Kacheln dieselbe Symmetrie haben wie die ihnen zugewiesenen Buchstaben (mit anderen Worten, die Aktionen der Diedergruppe D4 sind für die Kacheln und die entsprechenden Buchstaben isometrisch). Dank dieses Systems reicht es aus, die Paare benachbarter Kacheln nur nach ihrer Symmetrie aufzulisten und die Liste der Nachbarn für Kachelsätze mit vielen symmetrischen Kacheln mehrmals zu verkürzen (selbst in den Kacheln des Sommerreliefs betrachtet das System solche Kacheln als symmetrisch, obwohl die Bilder nicht symmetrisch sind).








Beachten Sie, dass ein unbegrenzter Kachelsatz von Knoten (in dem alle 5 Kacheln gültig sind) für den WFC-Algorithmus nicht interessant ist, da Sie nicht in eine Situation geraten können, in der es unmöglich ist, eine Kachel zu platzieren. Wir nennen Kachelsätze mit dieser Eigenschaft "einfach". Ohne komplexe Heuristiken erzeugen einfache Kachelsätze keine interessanten globalen Strukturen, da die Korrelationen in einfachen Kachelsätzen aus der Ferne schnell abnehmen. Viele einfache Kacheln finden Sie auf
cr31 . Schauen Sie sich dort das doppelseitige „Dual“ -Kachelset an. Wie kann er Knoten erstellen (ohne T-förmige Verbindungen, das heißt schwierig) und gleichzeitig einfach sein? Die Antwort ist, dass es nur einen schmalen Knotentyp und keinen beliebigen Knoten erzeugen kann.
Es ist auch erwähnenswert, dass Circuit-, Summer- und Rooms-Kachelsätze keine Van-Kacheln sind. Das heißt, die Daten ihrer Nachbarschaft können nicht aus der Färbung der Kanten erzeugt werden. Beispielsweise können im Schaltungskachelsatz (integrierte Schaltung) zwei Ecken nicht benachbart sein, obwohl sie mit einer Verbindung verbunden werden können (Verbindung), und diagonale Spuren können die Richtung nicht ändern.
Höhere Dimensionen
Der WFC-Algorithmus in höheren Dimensionen funktioniert genauso wie in zwei Dimensionen, aber die Leistung wird hier zum Problem. Diese Voxelmodelle wurden bei N = 2 im Kachelmodell mit Überlappung unter Verwendung von 5x5x5- und 5x5x2-Blöcken und zusätzlichen Heuristiken (Höhen, Dichten, Krümmungen ...) erzeugt.
Screenshots höherer Dimensionen:
1 ,
2 ,
3 .
Mit WFC und anderen Algorithmen generierte Voxel-Modelle befinden sich in einem separaten Repository.
Eingeschränkte Synthese
Der WFC-Algorithmus unterstützt Einschränkungen. Daher kann es leicht mit anderen generativen Algorithmen oder der manuellen Erstellung kombiniert werden.
So schließt der WFC automatisch eine von einer Person initiierte Ebene ab:
GIF |
GIFVDer
ConvChain- Algorithmus erfüllt die strenge Version der Bedingung (C2): Die Verteilung der Grenzen der NxN-Muster in den von ihm erstellten Ausgabedaten entspricht genau der Verteilung der Muster in den Eingabedaten. ConvChain erfüllt jedoch nicht (C1): Oft entstehen auffällige Artefakte. Es ist logisch, zuerst ConvChain zu starten, um eine gut abgetastete Konfiguration zu erhalten, und dann WFC, um lokale Artefakte zu korrigieren. Dies ähnelt einer in der Optimierung üblichen Strategie: Zuerst führen wir die Monte-Carlo-Methode aus, um den Punkt zu finden. nahe am globalen Optimum und führen Sie dann einen Gradientenabstieg von diesem Punkt aus durch, um eine höhere Genauigkeit zu erzielen.
Der
Textur-Synthesealgorithmus von P. F. Harrison ist viel schneller als WFC, hat jedoch Probleme mit langen Korrelationen (zum Beispiel ist dieser Algorithmus schwierig, Ziegelmauertexturen mit korrekt gebauten Ziegeln zu synthetisieren). In solchen Fällen demonstriert WFC seine Überlegenheit, und Harrisons Algorithmus unterstützt Einschränkungen. Es ist sinnvoll, zuerst das ideale Backsteinmauerschema mit WFC zu generieren und dann einen begrenzten Textur-Synthesealgorithmus für dieses Schema durchzuführen.
Kommentare
Warum wird die Heuristik der minimalen Entropie verwendet? Mir ist aufgefallen, dass Menschen, die etwas zeichnen, oft selbst der Heuristik der minimalen Entropie folgen. Deshalb ist der Algorithmus so interessant anzusehen.
Das überlappende Modell entspricht einem einfachen Modell auf die gleiche Weise, wie Markov-Ketten höherer Ordnung Markov-Ketten erster Ordnung entsprechen.
Es sollte beachtet werden, dass die Entropie eines Knotens in der Ausbreitungsstufe nicht zunehmen kann, d.h. Die Wahrscheinlichkeiten erhöhen sich nicht, können aber auf Null zurückgesetzt werden. Wenn die Ausbreitungsstufe die Entropie nicht weiter reduzieren kann, aktivieren wir die Beobachtungsstufe. Wenn die Beobachtungsstufe die Entropie nicht reduzieren kann, bedeutet dies, dass der Algorithmus die Arbeit beendet hat.
Die Ausbreitungsphase im WFC-Algorithmus ist dem Schleifen-Glaubensausbreitungsalgorithmus sehr ähnlich. Eigentlich habe ich ursprünglich die Glaubensausbreitung (BP) programmiert, dann aber auf die Weitergabe mit Einschränkungen mit einer festen stationären Verteilung umgestellt, da BP ohne massive Parallelisierung (in der CPU) viel langsamer ist und für meine Aufgaben keine wesentlich besseren Ergebnisse liefert.
Beachten Sie, dass die Beispiele „Simple Knot“ und „Trick Knot“ nicht zwei, sondern drei Farben haben.
Eine Dimension kann Zeit sein. Insbesondere zeigt die d-dimensionale WFC das Verhalten eines beliebigen (d-1) -dimensionalen zellularen Automaten.
Referenzen
Dieses Projekt basiert auf der Arbeit von Paul Merrell zur Synthese von Modellen, insbesondere auf dem Kapitel über die diskrete Synthese von Modellen aus
seiner Dissertation . Paul verbreitet die Grenzen der Nachbarschaft in einem sogenannten einfachen Kachelmodell mit einer Heuristik, die versucht, die Ausbreitung in einem kleinen Bewegungsbereich zu berechnen.
Mein Projekt wurde auch stark vom Kapitel über die deklarative Synthese von Texturen aus
Paul F. Harrisons Dissertation beeinflusst . Paul legt die Daten für die Nachbarschaft von Kacheln fest, markiert deren Grenzen und verwendet die Rückgabesuche, um die Kachelkarte zu füllen.
Montage
WFC ist eine Konsolenanwendung, die nur von der Standardbibliothek abhängt. Laden Sie
.NET Core für Windows, Linux oder macOS herunter und führen Sie es aus
dotnet run WaveFunctionCollapse.csproj
Sie können auch Anweisungen zum Aufbau einer Community für verschiedene Plattformen in der
entsprechenden Ausgabe verwenden . Casey Marshall hat eine
Pull-Anforderung erstellt , die die Verwendung eines Befehlszeilenprogramms vereinfacht und ein Snap-Paket enthält.
Interessante Häfen, Gabeln und Ausgründungen
- Emil Ernerfeld hat einen Port in C ++ erstellt .
- Max Eller hat die Kotlin Library (JVM) namens Kollapse erstellt . Joseph Roscopf erstellte einen Line-by- Port-Port für Kotlins optimierte Version des 2018-Algorithmus. Edwin Jacobs hat eine weitere Kotlin-Bibliothek erstellt .
- Kevin Chapelier hat einen Port auf JavaScript erstellt .
- Oscar Stalberg hat ein dreidimensionales Kachelmodell programmiert, ein zweidimensionales Kachelmodell für ungleichmäßige Gitter in einer Kugel. Hier sind die schönen 3D-Kachelsätze für sie: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 .
- Joseph Parker hat WFC für Unity angepasst und damit Skateparks im Spiel Proc Skater 2016 , fantastische Hochebenen im Swapland-Spiel 2017 und Plattform-Levels im Bug with a Gun- Spiel 2018 generiert .
- Martin O'Leary verwendete einen WFC-ähnlichen Algorithmus , um Gedichte zu generieren: 1 , 2 , 3 , 4 .
- Nick Nenov hat ein dreidimensionales Voxel-Kachelset basierend auf meinem Castle-Kachelset erstellt. Nick verwendet die Textausgabeoption für das Kachelmodell, um 3D-Modelle in Cinema 4D neu zu erstellen.
- Sean Lefler hat ein Modell mit einer Überlappung von Rust implementiert.
- rid5x erstellt eine Version von WFC unter OCaml .
- Ich habe ein einfaches dreidimensionales Kachelmodell veröffentlicht, damit Benutzer ihre eigenen 3D-Kachelsätze erstellen können, ohne auf ein vollständiges Repository eines dreidimensionalen Algorithmus warten zu müssen.
- Ich habe ein interaktives Modell des überlappenden Modells erstellt. Die ausführbare GUI-Datei kann von den WFC-Seiten auf itch.io heruntergeladen werden.
- Brian Buckley hat eine Level-Generierungs-Pipeline für das Caves of Qud-Spiel zusammengestellt , die WFC in mehreren Durchgängen verwendet: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 17 , 18 , 19 , 20 , 21 .
- Danny Wine hat ein dreidimensionales Fliesenmodell implementiert.
- Arvi Teikari hat einen enturieheuristischen Textur-Synthesealgorithmus für Lua programmiert. Headchant portierte es, um mit LÖVE zu arbeiten.
- Isaac Curt hat einen Port für das Python- Modell mit Überlappung erstellt.
- Oscar Stalberg hat eine interaktive Version des Kachelmodells erstellt, das im Browser ausgeführt wird.
- Matt Ricks implementierte ein dreidimensionales Kachelmodell ( 1 , 2 , 3 , 4 ) und erstellte ein dreidimensionales Kachelmodell, bei dem eine der Dimensionen die Zeit ist ( 1 , 2 , 3 , 4 , 5 ).
- Nick Nenov erstellte einen visuellen Leitfaden für das Fliesensymmetriesystem.
- Isaac Curt und Adam M. Smith haben einen Forschungsartikel geschrieben, in dem sie WFC als ASP-Aufgabe formulieren, den allgemeinen Clingo General Constraint Solver verwenden , um Bitmaps zu generieren, mit globalen Einschränkungen zu experimentieren, den Verlauf von WFC zu verfolgen und eine detaillierte Beschreibung des Algorithmus bereitzustellen.
- Sylvain Lefebvre erstellte eine C ++ - Implementierung der Synthese dreidimensionaler Modelle, beschrieb den Denkprozess beim Erstellen eines Beispiels und zeigte ein Beispiel, in dem Nachbarschaftsbeschränkungen sicherstellen, dass der Ausgang verbunden ist (Sie können ihn umgehen).
- Ich habe die dreidimensionale WFC so verallgemeinert, dass sie mit der Würfelsymmetriegruppe zusammenarbeitet und ein Kachelset erstellt, das Szenen im Stil von Escher generiert.
- Es gibt viele Möglichkeiten, teilweise beobachtbare Wellenzustände zu visualisieren. Im Code werden die Farbwerte der möglichen Optionen gemittelt, um die endgültige Farbe zu erhalten. Oscar Stalberg zeigt teilweise beobachtbare Zustände als durchscheinende Rechtecke: Je mehr Optionen, desto größer das Rechteck. In einem Voxelschema visualisiere ich Wellenzustände durch pixelweise Abstimmung.
- Remy Devo implementierte das Kachelmodell in PICO-8 und schrieb einen Artikel über die kohärente Datengenerierung mit einer Erklärung von WFC.
- Für sein Spiel Bad North verwendet Oscar Stalberg eine Heuristik, die versucht, solche Kacheln so auszuwählen, dass in jeder Phase die resultierende beobachtete Zone passierbar ist.
- William Manning implementierte ein überlappendes Modell in C #; Zunächst versuchte er, den Code lesbar zu machen, und ergänzte WPF durch eine grafische Oberfläche.
- Joseph Parker hat ein WFC- Tutorial für Procjam 2017 geschrieben.
- Aman Tiwari formulierte die Verbindungsbeschränkung als ASP-Aufgabe für Clingo.
- MatveyK hat ein dreidimensionales Modell mit Überlappung programmiert.
- Silvan Lefebvre , Lee Yu Wei und Connelly Barnes untersuchen die Möglichkeit, Informationen in Texturen zu verstecken. Sie haben ein Tool erstellt , mit dem Textnachrichten als WFC-Kacheln codiert und zurückcodiert werden können. Diese Technik ermöglicht die Verwendung von WFC-Kacheln als QR-Codes.
- Mathieu Fer und Nathaniel Kuran haben die WFC-Laufzeit für ein überlappendes Modell um eine Größenordnung erheblich verbessert . Ich habe ihre Verbesserungen in den Code integriert.
- Vasu Mahesh portierte ein dreidimensionales Kachelmodell nach TypeScript, erstellte ein neues Kachelset und visualisierte den Generierungsprozess in WebGL.
- Kim Huanghee experimentierte mit dreidimensionalem WFC und erstellte / adaptierte viele Voxel-Kachelsätze: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 .
- Oscar Stalberg hielt auf der Everything Procedural Conference 2018 einen Vortrag über die Levelgenerierung in Bad North.
- Ich schrieb darüber, wie man mit WFC und anderen Algorithmen (ungefähr) unverzerrte Pfade zwischen zwei Punkten erzeugt.
- Aiser Curt und Adam M. Smith veröffentlichten einen Preprint , der das WFC-basierte System beschreibt, das aus positiven und negativen Beispielen lernt, und sprachen im allgemeinen Kontext von Dialogen mit Beispielgeneratoren darüber.
- Brandan Anthony verwendet WFC, um Wanddekorationen in Rodina zu generieren.
- Tim Kong hat ein überlappendes Modell für Haxe implementiert.
- Boris der Tapfere wandte die Meißelmethode auf den WFC an, um verbundene Strukturen zu erzeugen. Er hat eine Bibliothek veröffentlicht, die hexagonale Netze, zusätzliche Einschränkungen und Backtracking unterstützt.
- Marian Kleineberg schuf für Procjam 2018 einen Stadtgenerator nach dem Fliesenmodell. Er schrieb einen Artikel über seine Ansätze zur Einstellung der Nachbarschaft, zurückgehen und WFC-Online-Variationen.
- Sol Bekic programmierte mit PyOpenCL ein GPU-basiertes Kachelmodell. Anstatt eine Warteschlange von Knoten zu speichern, von denen aus die Verteilung durchgeführt wird, führt dieses Modell gleichzeitig die Verteilung von jedem Gitterknoten aus.
- Wouter van Oortmerssen implementierte das Kachelmodell in einer einzelnen C ++ - Funktion mit einer Struktur zur Beschleunigung der Beobachtung, ähnlich einer Prioritätswarteschlange.
- Robert Hoenig implementierte ein Modell mit Überlappung von Julia mit der Option, Einschränkungen nur lokal zu verteilen.
- Edwin Jacobs wandte WFC auf Stilübertragung und Dithering an .
Danksagung
Einige Beispiele stammen aus Ultima IV- und
Dungeon Crawl- Spielen. Tileset Circles von
Mario Klingemann . Die Idee, integrierte Schaltkreise zu erzeugen, wurde von
Moonasaur vorgeschlagen, und ihr Stil wurde dem Spiel
Ruckingenur II von Zachtronics entnommen. Das Cat-Überlappungsbeispiel stammt aus dem Nyan Cat-Video, das Qud-Beispiel wurde von
Brian Buckley erstellt , die Magic Office + Spirals-Beispiele sind rid5x, die Colored City + Link + Link 2 + Mazelike + Red Dot + Smile City-Overlays sind Arvi Teikari. Der Tileset Summer wurde von Hermann Hillmann kreiert. Voxel-Modelle werden in
MagicaVoxel gerendert.