Ich möchte in eine Zeichenebene, die eine Grafik enthält, Wolken und
andere undichte, gasförmige Objekte einblenden.
Dafür benötige ich eine Library, die mit (X,Y,T,P) aufgerufen wird und
einen Funktionswert zurückgibt, der die Dichte und Farbe des Rauchwertes
repräsentiert. Welche Formeln nimmt man da?
Rekursion oder Iteration oder 3D ist nicht möglich. Es müsste eine
Gleichung mit endlicher Länge sein, die nur vorwärts rechnet und nicht
zu lange braucht.
Einfach sind z.B. Sonne mit Strahlen, da lautet die Gleichung für den
Kreis einfach "wenn x*x + y*y < r*r dann Farbe = gelb, sonst = null"
Auch einen Himmel und einen Fabrverlauf kann man einfach erzeugen.
Aber für Rauch braucht man eigentlich das Integral quer durch den Raum
entlang der Z-Achse und ein 3D-Dichtemodell. Daraus würde dann eine
Formel mit X,Y,P entstehen, bei der Z wegfiele.
Mich interessiert, wie Z.B. Photoshop das macht.
Idee?
Postmann schrieb:> Mich interessiert, wie Z.B. Photoshop das macht.
Ich könnte mir vorstellen, dass Photoshop auf diese Einschränkung
verzichtet:
> Rekursion oder Iteration oder 3D ist nicht möglich.
Postmann schrieb:> Aber für Rauch braucht man eigentlich das Integral quer durch den Raum> entlang der Z-Achse und ein 3D-Dichtemodell.
Nicht entlang der Z-Achse, sondern entlang dem Sehstrahl. Der
Integrationsweg läuft als Gerade schief durch den Raum.
Postmann schrieb:> Rekursion oder Iteration oder 3D ist nicht möglich. Es müsste eine> Gleichung mit endlicher Länge sein, die nur vorwärts rechnet und nicht> zu lange braucht.
Was verstehst du denn unter "nur vorwärts"? Gibt's auch Gleichungen, die
rückwärts rechnen?
> Aber für Rauch braucht man eigentlich das Integral quer durch den Raum> entlang der Z-Achse und ein 3D-Dichtemodell.
Und man braucht vor allem eine z-Map des Bildes.
Das mit dem Strahl ist klar, es ist sozusagen der kreisförmige Blick.
Eine Z-map wäre eine Angabe, was im Vordergrund ist, nehme ich an. Die
könnte ich ermitteln.
Wie wende ich die an?
Der Rauch soll allerdinhs im Vordergrund sein und alles andere
verdecken.
Postmann schrieb:> Das mit dem Strahl ist klar, es ist sozusagen der kreisförmige Blick.>> Eine Z-map wäre eine Angabe, was im Vordergrund ist, nehme ich an.
Sozusagen, ja. Sie gibt pro Pixel an, wie weit das dort zu sehende
Objekt an dieser Stelle weg ist. Siehe
https://en.wikipedia.org/wiki/Depth_map> Wie wende ich die an?
Du musst ja für jeden Pixel wissen, wieviel Weg von der Kamera bis zu
dem dort sichtbaren Objekt durch den Nebel zurückgelegt wird. Wenn die
im Bild sichtbaren Objekte im Nebel sein sollen, musst du dazu auch
wissen, wie weit sie weg sind.
> Der Rauch soll allerdinhs im Vordergrund sein und alles andere> verdecken.
Sofern "alles andere" nicht innerhalb des Rauchs ist, sondern nur
dahinter, brauchst du keine z-Map.
Ok, damit wäre das Thema Neben zurückgeführt auf die Z-Map. Ich dachte
mir, daß ich je nach Tiefe, die ich kenne, das Signal eingraue, also die
Faben verschwinden lasse. Um noch Diffusion zu erzeugen, habe ich keine
Rechenzeit. Muss auch nicht sein.
Bleibe noch der Rauch. Ich habe verschiedene Photohop-Tutorials
durchgesehen und die arbeiten mit Verschmieren. Das kann ich nicht
machen. Ich müsste quasi das Endergebnis haben.
Quasi :
Wenn Bedingung X,Y = wahr, dann Inhalt = Inhalt (X1,Y1), also der
Rauchquelle und dann ein bischen davon.
Wie macht man die Wolke? Wie definiert man eine 3D-Dichte?
Eine Kugel z.B. hat klare Grenzen und die Tiefe schwankt zwischen 0 und
dem Durchmnesser, wenn man gerade durchchaut. Ich brauche jetzt eine
Formel für die Dichte am Punkt X,Y,Z. Ich habe da leider keine Idee.
Postmann schrieb:> Wie macht man die Wolke? Wie definiert man eine 3D-Dichte?
Eine solche "3D-Dichte" lässt sich sicher in Form irgendeiner
analytischen Gleichung beschreiben, wenn man ein bischen rumprobiert.
Kommt halt drauf an. Elektrische Felder kannst Du in jedem Fall so
beschreiben.
Bliebe nur noch, aufzusummieren, welche Dichte entlang der Blickachse
entsteht.
Postmann schrieb:> Ich möchte in eine Zeichenebene, die eine Grafik enthält, Wolken und> andere undichte, gasförmige Objekte einblenden.
povray kann das.
Eine Wolke ist Nebel mit Struktur. Und ein vernuenftier Nebel hat auch
ne Struktur, also nicht einfach nur einen Absorptionskoeffizienten.
Eigentlich ist man mit einem Absorptionskoeffizienten auch nicht dabei.
Rauch ist Absorption, allenfalls mit einem Farbfilter
Nebel & Wolken sind erst mal Streuer.
Andreas F. schrieb:> Eine solche "3D-Dichte" lässt sich sicher in Form irgendeiner> analytischen Gleichung beschreiben
Sicher nicht alle. Es gibt ganz bestimmte mathematische Kriterien, die
das bedingen. Ansonsten braucht es Näherungen.
> Klektrische Felder kannst Du in jedem Fall so beschreiben.
Wenn sie eine Quelle haben und homogen sind, d.h. "konservativ". Das ist
eine solche Bedingungen. Ansonsten bleibt die Überlagerung mehrerer
Felder, was natürlich seine Grenzen hat.
> Bliebe nur noch, aufzusummieren, welche Dichte entlang der Blickachse> entsteht.
Das erfordert meistens eine numerische Integration. In den besonderen
Fall eines o.g. monotonen Verlaufes, konret einer holomorphen Funktion,
kann man das Integral analytisch bilden und die Integration manuell
ausführen. Damit fällt eine Dimension weg und man bekommt direkt einen
Funktionswert für X,Y.
Ich habe für meinen 3D-Simulator sowas für einfache Objekte am Beispiel
von Röntgenstrahlen erarbeitet. Die Dichte ist als D(x,y,z) vorgeben und
man bekommt die Absorbtion für das diskrete Integral A(u,v). Man muss
nur eine Brennweite, Abbildung und Vergrösserung einfliessen lassen, um
von den virtuellen Bildkoordinaten u,v, die realen Raumkoordinaten des
Objektes und vor allem die validen Bereiche des Integrals des Objektes
(x,y,z) abzuleiten. Die Formel eliminiert z und bildet sie als Volumen-
bzw Doppelintegral nach CauchyII ab.
Die Einschränkung ist dabei halt, dass man nicht alle Dichteverläufe
definieren kann.
Damit hat man schon mal die Absorbtion. Die Streuung ist halt ein
Problem, weil man da mehrdimensional rechnen muss, wie ein Render-Algo.
Das geht nicht mehr zweidimensional.
Moin,
ich habe mal vor Jahren sowas als Animation in Blender/Python gemacht.
Geht auf mehrere Arten: Sehr genau mit Diffusionsgleichung und etwas
Bernoulli für Turbulenzen oder hingefaket. Letzteres kann erstaunlich
gut aussehen.
Kurzanleitung:
- Sich einen Satz wolkenförmiger Blobs in RGBA-Format mit niedrigem
Alpha basteln
- Pfad z.B. als Polygonzug und einfache Hindernisse als Punktwolken
vorgeben
Dann rendert man entsprechend der Dichte genügend dieser
unterschiedlichen Alpha-Blobs übereinander, für die Animation kann man
mit der Grösse (Rand der Rauchfahne, bis zum Auflösen des Blobs mit
abnehmendem Alpha) und Rotation spielen.
z.B. Hinternisse erzeugen Reibung -> Rotation, die sich mit einem
Bruchteil auf benachbarte Blobs propagieren.
Convolution operation ist auch ein wichtiger Stichpunkt. Damit wird das
Übersprechen der benachbarten Bildpunkte mathematisch formuliert. So
werden Weichzeichner und Kontrastschärfung hergestellt. Ob man das auf
Farb- und/ oder Ortswerte anwendet wirkt sich auf die Effektart aus.
(Matrixoperation, sog. convolution matrix wird mit fortlaufendem Versatz
über die Wertmatrix geschoben und angewendet. So werden immer Blöcke von
Bildpunkten bspw. mit einer Gauss-Kurve o.ä. verwurstelt.)
@Strubi
Danke für Deine Ausführungen, jedoch sind solche Ansätze mit Rendering
zu aufwendig, zumal ich sie nicht vollständig durchschaue. Das, was
diese "blobs" machen, müsste ich als Formel haben. Die Idee mit dem
RGB+Alpha hatte ich auch schon, nur fehlt mir der Denkansatz, wie ich
eine Formel beschreibe, die solche Dichten hinbringt.
@Jürgen
Die Überlegung, die 3. Dimension in die Formel zu verpacken, gefällt
mir, aber auch dann muss ich eine 3D-Formel haben. Bisher habe ich noch
nichts Brauchbares entwickeln können. Ich bin z.B. zu folgender Idee
gekommen:
Überall, wo X und Y und Y innerhalb einer Wolke denselben Wert haben,
entsteht eine 1, ansonsten eine 0. Das ergab ein 3D-Punktgitter. Das
Ganze dann verschmiert, durch oversanning.
Dann habe ich es mal "analog" gemacht, und formuliert, dass die
Abweichung der Koordinate eine Rolle spielt und der Wert bei Annäherung
steigt. Das ergab dann Kugelgebilde.
Beispiel in 2D:
1
XTEMP = SIN(A*X)
2
YTEMP = SIN(B*Y)
3
4
DIFF = XTEMP - YTEMP
5
DIFF2 = DIFF * DIFF
6
7
IF DIFF2 > MAX THEN ALPHA = 1
8
ELSE ALPHA = MAX - DIFF2
Dazu habe ich jetzt noch Unregelmäßigkeiten involviert, damit es kein
regelmäßiges Raumgitter wird. Das Ergebnis ist aber immer noch zu
regelmässig. Ideen?
@Boris: Weichzeichner ist drin. Habe hier mal 5 Ebenen gerechnet.
Postmann schrieb:> Ich dachte mir, daß ich je nach Tiefe, die ich kenne, das Signal> eingraue, also die Faben verschwinden lasse. Um noch Diffusion zu> erzeugen, habe ich keine Rechenzeit. Muss auch nicht sein.
Knackscharfe Bilder durch Rauch hindurch werden nicht besonders
naturgetreu aussehen. Für realsistische Darstellung wirst du die PSF
berücksichtigen müssen.
Das weiter oben angehängt Bild schaut aus, wie Rauch - allerdings der,
der sich in Lungen abgesetzt hat :-)
Die Partikel müssten viel kleiner sein, also eher 2D-Rauschen, wie die
spray-Funktion beim Programm Paint Brush. Verschmieren würde ich das
nicht, oder nur wenig. Es tritt ja keine oder kaum Beugung auf. Beim
Feuer macht man das so, daß man den dahinter befindlichen Hintergrund
leicht verschwimmen lässt. Beim Nebel könnte man mit etwas Unschärfe
arbeiten, aber der fogging-Effekt ist hauptsächlich der eines
Grauwerdens.
Boris O. schrieb:> Convolution operation ist auch ein wichtiger Stichpunkt. Damit wird das> Übersprechen der benachbarten Bildpunkte mathematisch formuliert.
Hallo Boris, falls du noch mitliest:
Könntest Du das bitte mal näher beschreiben?
Danke!
Schade, schade, hatte mir den thread extra abboniert. Keiner mehr
interessiert?
Ich hätte eine neue Idee, nämlich eine 3D-Funktion, abhängig von X, Y, Z
und welche in jedem Punkt eine Dichte angibt. Nun löst man das Integral
allgemein für eine bestimmte Projektionsrichtung, indem man einfach die
Dichten aufaddiert, integriert und die Funktion erhält, welche in der
Draufsicht U und V = f (x,y,z) den summierten Dichtewert liefert. Der
ist dann ein Mass für die Wolkenschwärzung.
Bliebe die Frage nach einer einfachen universellen Dichtefunktion, die
sich leicht integrieren liesse und die zeitabhängige Wirbel enthält.
Sowas müsste doch mit Divergenz und Rotation gehen, oder?
Carlo schrieb:> Schade, schade, hatte mir den thread extra abboniert. Keiner mehr> interessiert?
Scho, schon, nur wenig Zeit. Ich befasse mich derzeit mit Servern und
Unix-Clustern und wie formieren solche Rechensysteme zu parallelen
Verarbeitung. Einer der Kunden ist ein Ausrüster für Wetterdienste zur
Ausarbeitung von Vorhersagen und wissenschaftlichen Instituten, die
Klimaprognosen anstellen.
Wolkensimulation ist da ein Thema. Was interessant wäre, ist die
Dämpfung und Streuung von Licht in den unterschiedlichen Dichten der
Wolken.
Eine Formel, das direkt zu errechnen und nachzubilden habe ich hier aber
auch nicht. Was die Kunden da haben, weiß ich nicht. Rücken die wohl
auch nicht raus:-)