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:
Exponentielle Verringerung der Staubdichte (Hintergrundniveau Null):
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 .
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:
- 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.
- Gibt es eine physikalische Interpretation, die die Verwendung einer dieser Verteilungen rechtfertigen würde oder die eine bessere vorschlagen würde?
quelle
Antworten:
Siehe das in SIGGRAPH 2000 veröffentlichte Papier Computermodellierung von gefallenem Schnee :
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:
quelle