Gibt es eine etablierte Methode zur Annäherung der Staubverteilung auf Oberflächen?

8

Intuitiv setzt sich Staub in Bereichen mit langsamerem Luftstrom schneller auf Oberflächen ab. Dies bedeutet, dass anstelle einer Oberfläche, die eine gleichmäßige Staubschicht sammelt, mehr Ecken vorhanden sind - Ecken eines Raums / Regals, Ecken, die durch die Platzierung von Objekten auf einer Oberfläche gebildet werden, Konkavitäten in einer Oberfläche.

Ich kann den Realismus steigern, indem ich einfach die Dicke / Dichte des Staubes mit der Entfernung von einem Objekt verringern und diesen Effekt für mehrere Objekte einschließlich Wände kombinieren kann. Dies ergibt natürlich die erwartete Reihenfolge der Dicken - die Kanten eines Bodens haben mehr Staub als die Mitte, die Ecken, an denen sich die Kanten treffen, haben mehr Staub als die Mitte der Kanten. Die Zunahme des Realismus durch die richtige Reihenfolge lässt jedoch immer noch das Problem offen, das richtige Verhältnis zu finden. Es gibt mehr Staub an den Stellen, an denen Sie mehr Staub erwarten, aber nicht unbedingt die richtige Menge mehr.

Gibt es eine etablierte Methode zur Annäherung eines realistischen Dickenverhältnisses zwischen verschiedenen Punkten auf einer Oberfläche? Ich brauche dies nicht, um vollständig physikalisch genau zu sein (dies müsste Objekte berücksichtigen, die sich während der langen Zeit, in der sich Staub ansammelt, durch die Umgebung bewegen). Ich suche nur nach durchschnittlichem Verhalten, das für das menschliche Auge glaubwürdig erscheint.

Bei der Online-Suche habe ich hauptsächlich atmosphärische Modelle für Schwebstaub gefunden, anstatt die Staubablagerung auf einer Oberfläche zu modellieren.

Meine Versuche - lineare und exponentielle Verteilungen

Hier ist ein Code in Python 3 mit Pillow (der PIL-Gabel), der einige Distributionen demonstriert, mit denen ich experimentiert habe:

from PIL import Image
from math import exp


def linear(distance, scale):
    return max(0, 64 - distance * scale)


def exponential(distance, scale):
    return 64 * exp(-distance * scale)


def exponential_squared(distance, scale):
    return 64 * exp(-distance * distance * scale)


def gamma_corrected(value):
    corrected_value = int((value/255)**(1/2.2)*255)
    return corrected_value


def produce_image(image_size=(1024,1024),
                  glasses=(((100,300),90),((300,300),110)),
                  distribution=exponential,
                  scale=0.1,
                  background_level=0,
                  gamma=2.2,
                  filename='dusttest.png'
                  ):
    width, height = image_size
    pixels = []
    for y in range(height):
        for x in range(width):
            red, green, blue = pixel_value(x, y, image_size, glasses,
                                           distribution, scale,
                                           background_level
                                           )
            pixels.append((red, green, blue))

    image = Image.new('RGB', image_size, color=None)
    image.putdata(pixels)
    image.save(filename)


def pixel_value(x, y, image_size, glasses, distribution, scale,
                background_level
                ):
    width, height = image_size
    value = background_level
    value += distribution(x, scale)
    value += distribution(width-x, scale)
    value += distribution(y, scale)
    for glass in glasses:
        coords, radius = glass
        a, b = coords
        distance = ((x-a) ** 2 + (y-b) ** 2) ** 0.5 - radius
        if distance < 0:
            value = 0
            break
        value += distribution(distance, scale)
    value = 255 - gamma_corrected(value)
    return ((value, value, value))


if __name__ == '__main__':
    for scale in [0.1, 0.2, 0.4, 0.8]:
        produce_image(distribution=linear,
                      scale=scale,
                      background_level=20,
                      filename='linear-' + str(scale) + '-dusttest.png'
                      )
    for scale in [0.1, 0.05, 0.03, 0.01]:
        produce_image(distribution=exponential,
                      scale=scale,
                      background_level=0,
                      filename='exponential-' + str(scale) + '-dusttest.png'
                      )
    for scale in [0.01, 0.001, 0.0001, 0.00001]:
        produce_image(distribution=exponential_squared,
                      scale=scale,
                      background_level=0,
                      filename='exponential-squared-' + str(scale) + '-dusttest.png'
                      )

Stellen Sie sich vor, Sie schauen von oben auf ein weißes Regal, auf dem Trinkgläser stehen. Einige Zeit später werden die Gläser entfernt, um staubfreie kreisförmige Bereiche und eine Staubverteilung über den Rest des Regals zu hinterlassen. Der Staub wird durch die Position der Brille sowie der Rück- und Seitenwände beeinflusst. Die Vorderseite des Regals (unten im Bild) ist offen und hat keine Wand, um den Staub zu erhöhen.

Ausgabe

(Klicken für größere Bilder)

Lineare Reduzierung der Staubdichte plus konstanter Hintergrundstaubgehalt:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Exponentielle Verringerung der Staubdichte (Hintergrundniveau Null):

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Ich habe erwartet, dass die exponentielle Version näher an der Realität liegt, und ich bevorzuge das Ergebnis visuell. Ich weiß jedoch immer noch nicht, ob dies nah genug ist.

Dem Vorschlag von Alan Wolfe zur Normalverteilung folgend , habe ich auch Bilder exp(-distance ** 2)in verschiedenen Maßstäben hinzugefügt .

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Ich mag das auch sehr, aber ich konnte immer noch nicht erraten, welches davon und exponentiell ( exp(-distance)) am besten ist.

Ich suche auf zwei Arten nach Feedback:

  1. Sieht eine dieser Distributionen für Sie richtig / natürlich aus? Ich möchte Input von einem breiteren Spektrum menschlicher Augen, idealerweise mit spezifischen Problemen / Inkonsistenzen.
  2. Gibt es eine physikalische Interpretation, die die Verwendung einer dieser Verteilungen rechtfertigen würde oder die eine bessere vorschlagen würde?
Trichoplax
quelle
1
Haben Sie die Normalverteilung (Gaußsche Funktion) ausprobiert? Es scheint, dass es hier helfen würde, da es verwendet wird, um herauszufinden, wo sich die Dinge im Durchschnitt mit bestimmten Merkmalen von Wahrscheinlichkeiten befinden werden. Staub, der sich zufällig, aber seltener dort absetzt, wo mehr Luft strömt und häufiger in Spalten, scheint direkt im Steuerhaus zu sein.
Alan Wolfe
@AlanWolfe danke für den Vorschlag - ich habe einige weitere Bilder hinzugefügt, die darauf basieren.
Trichoplax
Exponential sieht für mich besser aus als linear oder normalverteilungsbasiert, aber ich habe keine nicht meinungsgebundenen Antworten, um irgendetwas über Korrektheit zu belegen: P
Alan Wolfe
Wie wäre es mit einer Art zellularer Automaten? Diffusionsschritt und dann erodieren diffus dann erodieren ...
joojaa

Antworten:

2

Siehe das in SIGGRAPH 2000 veröffentlichte Papier Computermodellierung von gefallenem Schnee :

In diesem Artikel stellen wir ein neues Modell der Schneeanhäufung und -stabilität für Computergrafiken vor. Unser Beitrag gliedert sich in zwei Hauptkomponenten, die jeweils für die Modellierung des Auftretens einer dicken Schneefallschicht auf dem Boden wesentlich sind. Unser Akkumulationsmodell bestimmt, wie viel Schnee eine bestimmte Oberfläche erhält, und berücksichtigt Phänomene wie Flockenflattern, Flockenstaub und vom Wind verwehten Schnee. Wir berechnen die Schneeanhäufung, indem wir Partikel nach oben in Richtung Himmel schießen und jeder Quelloberfläche eine unabhängige Kontrolle über ihre eigene Abtastdichte, Genauigkeit und Rechenzeit geben. Die Wichtigkeitsreihenfolge minimiert den Aufwand für die Probenahme und maximiert gleichzeitig die visuellen Informationen. Dadurch werden reibungslose Verbesserungen der globalen Ergebnisse erzielt, die jederzeit unterbrochen werden können. Sobald Schnee auf dem Boden landet, Unser Stabilitätsmodell bewegt Material in einer Reihe kleiner, gleichzeitiger Lawinen von physikalisch instabilen Bereichen weg. Wir verwenden einen einfachen lokalen Stabilitätstest, der sehr steile Oberflächen, Hindernisse, Kanten und Windtransporte behandelt. Unser Stabilitätsalgorithmus verarbeitet auch andere Materialien wie Mehl, Sand und fließendes Wasser.

Die Projektseite enthält Erklärungen und Beispielbilder. Ein PDF ist hier .

Ein älteres Papier ist Simulating Dust Accumulation , das 1995 in IEEE Computer Graphics & Applications veröffentlicht wurde:

Dieses Papier beschreibt eine Staubmodellierungstechnik. Eine empirische Methode wird verwendet, um den Effekt der Staubansammlung auf Objektoberflächen visuell zu simulieren. Die Staubmenge wird zunächst anhand der Eigenschaften der Oberflächen vorhergesagt: der Neigung der Oberfläche und der Klebrigkeit. Diese vorhergesagte Menge wird dann gemäß einigen externen Faktoren angepasst: Oberflächenexposition gegenüber Wind und Abkratzen durch andere Objekte. Die berechnete Staubmenge wird schließlich durch eine Rauschfunktion beim Rendern gestört, um einen unscharfen visuellen Effekt zu erzielen.

lhf
quelle