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.
:
Bearbeitet durch User
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.)
:
Bearbeitet durch User
>Was verstehst du denn unter "nur vorwärts"? Gibt's auch Gleichungen, die >rückwärts rechnen? Backtracking meint er vielleicht. Gruß J
@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:-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.