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:
Réduction exponentielle de la densité des poussières (niveau de fond nul):
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.
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:
- 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.
- Existe-t-il une interprétation physique qui justifierait l'utilisation d'une de ces distributions, ou qui en suggérerait une meilleure?
la source
Réponses:
Voir le document Computer Modeling of Fallen Snow publié dans SIGGRAPH 2000:
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:
la source