mikrocontroller.net

Forum: PC-Programmierung Wolken, Nebel und Rauch in Bitmap zeichnen


Autor: Postmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Postmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: Postmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Andreas F. (chefdesigner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Postmann schrieb:
> Ich möchte in eine Zeichenebene, die eine Grafik enthält, Wolken und
> andere undichte, gasförmige Objekte einblenden.

povray kann das.

Autor: Zitronen F. (jetztnicht)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Strubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Boris O. (bohnsorg) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
Autor: jbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was verstehst du denn unter "nur vorwärts"? Gibt's auch Gleichungen, die
>rückwärts rechnen?

Backtracking meint er vielleicht.

Gruß J

Autor: Postmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@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:
XTEMP = SIN(A*X)
YTEMP = SIN(B*Y)

DIFF = XTEMP - YTEMP
DIFF2 = DIFF * DIFF

IF DIFF2 > MAX THEN ALPHA = 1
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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Carlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Carlo (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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?

Autor: Andreas F. (chefdesigner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.