Volumen: Rauch, Feuer und Flüssigkeiten

Ein Volumen ist ein Block aus Voxeln statt einer Oberfläche: eine Rauchfahne, eine Flamme, eine Explosion, Wasser. Pixor liest .vdb-Dateien aus Blender, EmberGen und Houdini und hat ein paar eigene für den Fall, dass du kein Simulationswerkzeug hast.

Ein Volumen hat keine Geometrie. Es wird gezeichnet, indem für jedes Pixel ein Strahl hindurchläuft, auf dem Prozessor, und das Ergebnis kommt in dasselbe Bild wie das Modell — so sitzt eine Flamme vor einer Hand, eine Figur steht im Rauch, und Stufen, Linien und Bereinigung behandeln es genau wie alles andere.

Eins hinzufügen

Im Schritt Szene, im Menü + der Gliederung, unter Ein Volumen:

Paffen eine runde Rauchwolke
Flamme unten heiß und schmal, oben kühl und breit
Wolke breit, unten flach, oben klumpig
Nebel dünn, niedrig und gleichmäßig
Aus einer .vdb-Datei… eine Simulation aus Blender, EmberGen oder Houdini

Ein Volumen ist eine Volumen-Node des Szenen-Graph, und seine Zeile in der Gliederung ist dieselbe Node: Eine Zeile danach ist eine Reihe von Volumen, jedes von seiner Kopie platziert, und eines, das mit nichts verbunden ist, ist nicht in der Szene. Seine Einstellungen stehen ebenfalls auf der Node (pxr project scene game.pixor --set flame.voxels=48, über den Namen des Volumens).

Auf der Kommandozeile: --volume flame:0.5,0.8,0.5:0,0.55,0, wobei die Zahlen die Größe und dann die Position in Metern sind. Ein Pfad zu einer .vdb funktioniert an derselben Stelle: --volume smoke.vdb:1.2.

Getragen von einem Knochen geht ein Volumen in jedem Clip dorthin, wohin der Knochen geht – die Flamme einer Fackel in einer Hand –, und bleibt aufrecht, wie Feuer es tut; seine Position wird dann vom Knochen aus gemessen. Auf der Kommandozeile @BONE am Ende: --volume flame:0.25:0,0.05,0@hand.r.

Getragen vom Emitter eines Effekts ist ein Volumen Teil dieses Effekts: Es wird auf den eigenen Zeilen des Effekts gezeichnet, ab dem ersten Frame des Effekts, wo immer der Emitter ist – an seinem Knochen oder dort, wohin die Keys eines Clips ihn bewegen –, und auf keiner anderen Zeile. Der Rauch einer Explosion, das Feuer eines Zaubers. Seine Position wird dann vom Emitter aus gemessen. Auf der Kommandozeile @effect:N für den N-ten Effekt des Projekts: --effect explosion --volume puff:1.5@effect:1.

Wie es gezeichnet wird

Diese stehen unter Wie es gezeichnet wird im Inspektor des Volumens.

  • Dicke ist, wie viel Volumen ein Pixel braucht, bevor es überhaupt gezeichnet wird. Höher ergibt eine straffere, härtere Form; niedriger eine zartere.
  • Weicher Rand ist, wie breit der ausfransende Rand ist. Der Rand wird in einem geordneten Muster, das am Volumen selbst verankert ist, weggedithert, nie überblendet; so bleibt jedes Pixel auf der Palette, und das Muster krabbelt nicht, wenn sich das Volumen dreht.
  • Eigenschatten ist, wie stark sich das Volumen dort verdunkelt, wo das Licht hindurch muss.
  • Farbe ist die eigene des Volumens, und seine Rampe wird daraus gebaut. Heiße Farbe ist die Farbe des Teils, das brennt; setzt du sie gleich der Farbe, brennt nichts, was Rauch so will. Leuchtet über sagt, wie heiß ein Teil sein muss, bevor es unabhängig vom Licht die heiße Farbe annimmt.
  • Voxel ist, wie fein das Volumen entlang seiner längsten Seite zerteilt wird. Ein Sprite-Pixel will ein oder zwei Voxel: mehr flimmert nur, weil in jedem Frame ein anderes Voxel das Pixel gewinnt. Eine 256³-Simulation wird beim Laden darauf reduziert; deshalb bleibt eine Rauchfahne bei 32 px ruhig.
  • Samples ist, wie viele Punkte auf einem Strahl pro Voxel betrachtet werden. Zwei reichen bei Sprite-Größen; mehr ist glatter und langsamer.

Volumen bekommen keinen Glanz: Eine Wolke hat keinen, und die Dichte, aus der sie schattiert werden, ist so unruhig, dass sie funkeln würden, wenn man ihnen einen ließe.

Sequenzen: Bewegung hineinbringen

Eine .vdb ist ein stehendes Volumen. Eine Simulation schreibt eine Datei pro Frame – fire_0001.vdb, fire_0002.vdb und so weiter –, und wenn du Pixor auf die erste davon zeigst, spielt es den Rest ab.

Im Abschnitt Sequenz des Volumens:

Frames wie viele Dateien abgespielt werden, gezählt ab der geöffneten
Alle jede N-te Datei nehmen: Eine Simulation wird meist mit mehr Frames geschrieben, als ein Sprite braucht
Schleife schließen über so viele Frames vom Ende zurück in den Anfang überblenden, damit das Sprite ohne Sprung im Kreis läuft. Diese Dateien werden zur Überblendung und laufen nicht mit: fünf Dateien mit einer Überblendung von eins sind vier Frames

Auf der Kommandozeile folgt die Sequenz auf Größe und Ort: --volume fire_0001.vdb:1.5::24,2,4 – 24 Dateien, jede zweite, die letzten vier in die erste zurückgeblendet.

Eine Sequenz spielt mit jeder Bewegung, die das Sheet schon hat: Setz ein Feuer neben einen Gehzyklus, und die Frames des Feuers sind die Frames des Gehzyklus. Bewegt sich sonst nichts, ist die Sequenz die Bewegung und bekommt eine eigene Action namens volume.

Jeder Frame wird mit derselben Transformation platziert, genommen aus dem Rahmen, den die ganze Sequenz füllt, sodass eine wachsende Rauchsäule das Bild nicht in jedem Frame zurückschrumpft. Das heißt auch, dass Größe die Größe der ganzen Sequenz ist, nicht ihres ersten Frames.

Eine Sequenz liegt nie vollständig im Speicher: Jede Datei wird einmal gelesen, um diese Box zu finden, und dann wieder, wenn das Sheet oder die Vorschau ihren Frame erreicht, wobei die letzten drei behalten werden. Eine lange Simulation kostet Lesezeit, keinen Speicher.

Was Pixor liest

.vdb-Dateien mit Float- oder Vektor-Grids im üblichen Baum, mit Werten unkomprimiert, gezippt oder mit Blosc-LZ4 gepackt (in einen Stream pro Byte aufgeteilt oder nicht, wie Blosc 1.14 und neuer es schreibt), alle oder nur die aktiven – also das, was Blender, EmberGen, Houdini und die eigenen Tools von OpenVDB schreiben. Verpixelt wird ein Grid namens density, smoke, fog oder d, dann temperature, flame, heat oder fire für den heißen Teil, dann velocity für die Bewegung, die der Anti-Flacker-Durchgang nutzt. Die Oberfläche einer Flüssigkeit (ein Level-Set) wird als Dicke mit harter Kante gelesen, durch und durch massiv.

Alles, was Pixor nicht lesen kann, nennt es beim Namen, statt falsch herauszukommen: ein anderer Kompressor, eine andere Art von Baum, eine gescherte Transformation. pxr inspect fire.vdb gibt die Grids einer Datei, ihre Größe und ihre Voxelgröße aus.

Was es noch nicht gibt

  • Flüssigkeiten werden als Volumen gelesen und gezeichnet, ohne Schaum und ohne Spiegelung. Eine Wasserfläche mit beidem ist die Wasser-Node der Welt (Welten).

Was diese Seite beschreibt, gibt es in der Vollversion; die kostenlose Browser-Demo beschränkt sich auf den Standard-Look und das PNG-Sheet.

Im Browser testen Pixor holen