Existe-t-il une méthode établie pour estimer la répartition de la poussière sur les surfaces?

8

Intuitivement, la poussière se dépose sur les surfaces à un taux plus élevé dans les zones où le flux d'air est plus lent. Cela signifie qu'au lieu d'une surface rassemblant une couche uniforme de poussière, il y en aura plus dans les coins - coins d'une pièce / étagère, coins formés par le placement d'objets sur une surface, concavités dans une surface.

Je peux obtenir une augmentation du réalisme simplement en réduisant l'épaisseur / densité de la poussière avec la distance d'un objet et en combinant cet effet pour plusieurs objets, y compris les murs. Cela donne naturellement l'ordre prévu des épaisseurs - les bords d'un sol ont plus de poussière que le centre, les coins où les bords se rencontrent ont plus de poussière que le centre des bords. Cependant, l'augmentation du réalisme en obtenant la commande correcte laisse toujours le problème d'obtenir le bon rapport. Il y a plus de poussière dans les endroits où vous vous attendez à avoir plus de poussière, mais pas nécessairement la bonne quantité de plus.

Existe-t-il une méthode établie pour estimer un rapport d'épaisseur réaliste entre différents points d'une surface? Je n'ai pas besoin que cela soit complètement précis physiquement (cela devrait prendre en compte les objets qui se déplacent dans l'environnement pendant la longue période de prise de poussière). Je cherche juste un comportement moyen qui paraîtra crédible à l'œil humain.

En recherchant en ligne, j'ai principalement trouvé des modèles atmosphériques pour la poussière en suspension, plutôt qu'un moyen de modéliser le dépôt de poussière sur une surface.

Mes tentatives - distributions linéaires et exponentielles

Voici du code en Python 3 utilisant pillow (la fourchette PIL) qui illustre quelques distributions que j'ai expérimentées:

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'
                      )

Imaginez que vous regardez d'en haut sur une étagère blanche sur laquelle des verres ont été placés. Quelque temps plus tard, les verres sont retirés pour laisser des régions circulaires exemptes de poussière et une répartition de la poussière sur le reste de l'étagère. La poussière est affectée par la position des verres et des parois arrière et latérales. Le devant de l'étagère (bas de l'image) est ouvert, sans mur pour augmenter la poussière.

Production

(Cliquez pour des images plus grandes)

Réduction linéaire de la densité de la poussière et niveau de fond constant de la poussière:

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Réduction exponentielle de la densité des poussières (niveau de fond nul):

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Je m'attendais à ce que la version exponentielle soit plus proche de la réalité, et je préfère le résultat visuellement. Cependant, je ne sais toujours pas si c'est assez proche.

Suivant la suggestion d' Alan Wolfe de la distribution normale, j'ai également ajouté des images exp(-distance ** 2)à différentes échelles.

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

J'aime bien cela aussi, mais je ne pouvais toujours pas deviner lequel de ces éléments et exponential ( exp(-distance)) est le meilleur.

Je recherche des commentaires de deux manières:

  1. L'une de ces distributions vous semble-t-elle correcte / naturelle? Je souhaite avoir la contribution d'un éventail plus large d'yeux humains, idéalement avec des problèmes / incohérences spécifiques.
  2. Existe-t-il une interprétation physique qui justifierait l'utilisation d'une de ces distributions, ou qui en suggérerait une meilleure?
trichoplax
la source
1
Avez-vous essayé la distribution normale (fonction gaussienne)? Il semble que cela aiderait ici car il est utilisé pour déterminer où les choses seront en moyenne avec certaines caractéristiques des probabilités. La poussière se déposant au hasard mais moins souvent là où il y a plus de circulation d'air et plus souvent dans les crevasses semble juste dans sa timonerie.
Alan Wolfe
@AlanWolfe merci pour la suggestion - j'ai ajouté quelques images supplémentaires basées sur cela.
trichoplax
exponentielle me semble meilleure que linéaire ou basée sur une distribution normale, mais je n'ai pas de réponses sans opinion pour confirmer quoi que ce soit sur l'exactitude: P
Alan Wolfe
Que diriez-vous d'un automate cellulaire quelconque? Étape de diffusion puis érode diffuse puis
érode

Réponses:

2

Voir le document Computer Modeling of Fallen Snow publié dans SIGGRAPH 2000:

Dans cet article, nous présentons un nouveau modèle d'accumulation de neige et de stabilité pour l'infographie. Notre contribution est divisée en deux composantes majeures, chacune essentielle pour modéliser l'apparence d'une épaisse couche de neige au sol. Notre modèle d'accumulation détermine la quantité de neige reçue par une surface particulière, ce qui permet des phénomènes tels que le flottement des flocons, le dépoussiérage des flocons et la neige soufflée par le vent. Nous calculons l'accumulation de neige en projetant des particules vers le ciel, donnant à chaque surface source un contrôle indépendant sur sa propre densité d'échantillonnage, sa précision et son temps de calcul. L'ordre d'importance minimise l'effort d'échantillonnage tout en maximisant les informations visuelles, générant des résultats globaux améliorés en douceur qui peuvent être interrompus à tout moment. Une fois que la neige tombe sur le sol, notre modèle de stabilité éloigne le matériau des zones physiquement instables dans une série de petites avalanches simultanées. Nous utilisons un test de stabilité local simple qui gère les surfaces très raides, les obstacles, les bords et le transit du vent. Notre algorithme de stabilité gère également d'autres matériaux, tels que la farine, le sable et l'eau courante.

Sa page de projet contient des explications et des exemples d'images. Un PDF est ici .

Un article plus ancien est Simulating Dust Accumulation , publié dans IEEE Computer Graphics & Applications en 1995:

Cet article décrit une technique de modélisation de la poussière. Une méthode empirique est utilisée pour simuler visuellement l'effet de l'accumulation de poussière sur les surfaces des objets. La quantité de poussière est d'abord prédite en fonction des propriétés des surfaces: l'inclinaison de la surface et l'adhérence. Cette quantité prévue est ensuite ajustée en fonction de certains facteurs externes: exposition de la surface au vent et raclage par d'autres objets. La quantité de poussière calculée est finalement perturbée par une fonction de bruit sur le rendu pour donner un effet visuel flou.

lhf
la source