Esiste un metodo consolidato per l'approssimazione della distribuzione della polvere sulle superfici?


8

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:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Riduzione esponenziale della densità della polvere (livello di sfondo zero):

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

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.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

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:

  1. 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.
  2. Esiste un'interpretazione fisica che giustificherebbe l'uso di una di queste distribuzioni o che suggerirebbe una migliore?

1
Hai provato la distribuzione normale (funzione gaussiana)? Sembra che sarebbe di aiuto in questo caso poiché viene utilizzato per capire dove saranno le cose in media con determinate caratteristiche delle probabilità. La polvere si deposita casualmente ma meno spesso dove c'è più flusso d'aria e più spesso nelle fessure sembra proprio nella sua timoniera.
Alan Wolfe,

@AlanWolfe grazie per il suggerimento - Ho aggiunto altre immagini basate su quello.
trichoplax,

esponenziale mi sembra migliore di quello lineare o basato sulla distribuzione normale, ma non ho risposte di opinione per sostenere qualcosa sulla correttezza: P
Alan Wolfe,

Che ne dici di un automa cellulare di qualche tipo?
Passaggio di

Risposte:


2

Vedi l'articolo Computer Modeling of Fallen Snow pubblicato in SIGGRAPH 2000:

In questo documento, presentiamo un nuovo modello di accumulo di neve e stabilità per la computer grafica. Il nostro contributo è diviso in due componenti principali, ciascuna essenziale per modellare l'aspetto di uno spesso strato di nevicate sul terreno. Il nostro modello di accumulo determina la quantità di neve che riceve una particolare superficie, consentendo fenomeni quali flutter di fiocchi, spolveratura di fiocchi e neve spazzata dal vento. Calcoliamo l'accumulo di neve sparando particelle verso l'alto verso il cielo, dando a ciascuna superficie della sorgente un controllo indipendente sulla sua densità di campionamento, precisione e tempo di calcolo. L'ordinamento dell'importanza minimizza lo sforzo di campionamento massimizzando al contempo le informazioni visive, generando risultati globali senza problemi che possono essere interrotti in qualsiasi momento. Una volta che la neve atterra sul terreno, il nostro modello di stabilità allontana il materiale dalle aree fisicamente instabili in una serie di valanghe piccole e simultanee. Utilizziamo un semplice test di stabilità locale che gestisce superfici molto ripide, ostacoli, bordi e transito del vento. Il nostro algoritmo di stabilità gestisce anche altri materiali, come farina, sabbia e acqua corrente.

La sua pagina del progetto contiene spiegazioni e immagini di esempio. Un PDF è qui .

Un documento più vecchio è Simulation Dust Accumulation , pubblicato su IEEE Computer Graphics & Applications nel 1995:

Questo documento descrive una tecnica di modellizzazione della polvere. Un metodo empirico viene utilizzato per simulare visivamente l'effetto dell'accumulo di polvere sulle superfici degli oggetti. La quantità di polvere viene inizialmente prevista in base alle proprietà delle superfici: l'inclinazione e la viscosità della superficie. Questa quantità prevista viene quindi regolata in base ad alcuni fattori esterni: esposizione superficiale al vento e raschiatura da parte di altri oggetti. La quantità di polvere calcolata è infine disturbata da una funzione di rumore sul rendering per dare un effetto visivo sfocato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.