Intuitivamente, la polvere si deposita sulle superfici a una velocità maggiore nelle aree in cui il flusso d'aria è più lento. Ciò significa che invece di una superficie che raccoglie uno strato uniforme di polvere, ci sarà più negli angoli: angoli di una stanza / mensola, angoli formati dal posizionamento di oggetti su una superficie, concavità in una superficie.
Posso ottenere un aumento del realismo semplicemente riducendo lo spessore / la densità della polvere con la distanza da un oggetto e combinando quell'effetto per diversi oggetti tra cui le pareti. Ciò fornisce naturalmente l'ordine previsto degli spessori: i bordi di un pavimento hanno più polvere del centro, gli angoli in cui i bordi si incontrano hanno più polvere del centro dei bordi. Tuttavia, l'aumento del realismo derivante dal corretto ordine lascia ancora il problema di ottenere il giusto rapporto. C'è più polvere nei luoghi che ti aspetti di avere più polvere, ma non necessariamente la giusta quantità in più.
Esiste un metodo consolidato per approssimare un rapporto realistico di spessore tra punti diversi su una superficie? Non ho bisogno che questo sia completamente fisicamente accurato (che dovrebbe prendere in considerazione oggetti che si muovono nell'ambiente durante il lungo periodo impiegato per l'accumulo di polvere). Sto solo cercando un comportamento medio che sembrerà credibile all'occhio umano.
Nella ricerca online ho principalmente trovato modelli atmosferici di polvere sospesa, piuttosto che un modo di modellare la deposizione di polvere su una superficie.
I miei tentativi: distribuzioni lineari ed esponenziali
Ecco un po 'di codice in Python 3 usando pillow (la forcella PIL) che mostra un paio di distribuzioni con cui ho sperimentato:
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'
)
Immagina di guardare dall'alto in basso su una mensola bianca su cui sono stati posati dei bicchieri. Qualche tempo dopo gli occhiali vengono rimossi per lasciare regioni circolari prive di polvere e una distribuzione di polvere sul resto del ripiano. La polvere è influenzata dalle posizioni degli occhiali e dalle pareti posteriori e laterali. La parte anteriore dello scaffale (parte inferiore dell'immagine) è aperta, senza pareti per aumentare la polvere.
Produzione
(Fare clic per immagini più grandi)
Riduzione lineare della densità della polvere più livello costante di polvere:
Riduzione esponenziale della densità della polvere (livello di sfondo zero):
Mi aspettavo che la versione esponenziale fosse più vicina alla realtà e preferisco il risultato visivamente. Tuttavia, non so ancora se questo è abbastanza vicino.
Seguendo il suggerimento di Alan Wolfe sulla distribuzione normale, ho anche aggiunto immagini usando exp(-distance ** 2)
una varietà di scale.
Mi piace anche questo, ma non riesco ancora a indovinare quale di questi ed esponenziale ( exp(-distance)
) sia il migliore.
Sto cercando feedback in due modi:
- Alcune di queste distribuzioni ti sembrano giuste / naturali per te? Voglio input da una più ampia gamma di occhi umani, idealmente con problemi / incongruenze specifiche.
- Esiste un'interpretazione fisica che giustificherebbe l'uso di una di queste distribuzioni o che suggerirebbe una migliore?