¿Existe un método establecido para aproximar la distribución del polvo en las superficies?

8

Intuitivamente, el polvo se deposita en las superficies a mayor velocidad en áreas donde el flujo de aire es más lento. Esto significa que en lugar de una superficie que reúna una capa uniforme de polvo, habrá más en las esquinas: esquinas de una habitación / estante, esquinas formadas por la colocación de objetos en una superficie, concavidades en una superficie.

Puedo obtener un aumento en el realismo simplemente haciendo que el grosor / densidad del polvo se reduzca con la distancia desde un objeto, y combine ese efecto para varios objetos, incluidas las paredes. Esto naturalmente da el orden esperado de espesores: los bordes de un piso tienen más polvo que el centro, las esquinas donde los bordes se juntan tienen más polvo que el centro de los bordes. Sin embargo, el aumento en el realismo de obtener el orden correcto todavía deja el problema de obtener la relación correcta. Hay más polvo en los lugares donde esperas tener más polvo, pero no necesariamente la cantidad correcta más.

¿Existe un método establecido para aproximar una relación realista de espesor entre diferentes puntos en una superficie? No necesito que esto sea completamente exacto físicamente (eso tendría que tener en cuenta los objetos que se mueven a través del medio ambiente durante el largo período de acumulación de polvo). Solo estoy buscando un comportamiento promedio que se vea creíble para el ojo humano.

Al buscar en línea, he encontrado modelos atmosféricos para polvo suspendido, en lugar de una forma de modelar la deposición de polvo en una superficie.

Mis intentos: distribuciones lineales y exponenciales

Aquí hay un código en Python 3 usando la almohada (el tenedor PIL) que demuestra un par de distribuciones con las que he experimentado:

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

Imagina mirar hacia abajo desde arriba en un estante blanco al que se le han colocado vasos para beber. Algún tiempo después, se retiran los vidrios para dejar regiones circulares libres de polvo y una distribución de polvo sobre el resto del estante. El polvo se ve afectado por las posiciones de las gafas y las paredes posterior y lateral. El frente del estante (parte inferior de la imagen) está abierto, sin paredes para aumentar el polvo.

Salida

(Haga clic para ampliar las imágenes)

Reducción lineal de la densidad del polvo más un nivel constante de polvo de fondo:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Reducción exponencial de la densidad del polvo (nivel de fondo cero):

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Esperaba que la versión exponencial estuviera más cerca de la realidad, y prefiero el resultado visualmente. Sin embargo, todavía no sé si esto está lo suficientemente cerca.

Siguiendo la sugerencia de Alan Wolfe de la distribución normal, también agregué imágenes usando exp(-distance ** 2)en una variedad de escalas.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Esto también me gusta bastante, pero aún no podía adivinar cuál de estos y exponencial ( exp(-distance)) es el mejor.

Estoy buscando comentarios de dos maneras:

  1. ¿Alguna de estas distribuciones le parece correcta / natural? Quiero información de una gama más amplia de ojos humanos, idealmente con problemas / inconsistencias específicas.
  2. ¿Existe una interpretación física que justifique el uso de una de estas distribuciones, o que sugiera una mejor?
trichoplax
fuente
1
¿Has probado la distribución normal (función gaussiana)? Parece que ayudaría aquí, ya que se usa para determinar dónde estarán las cosas en promedio con ciertas características de probabilidades. El polvo se deposita al azar, pero con menos frecuencia donde hay más flujo de aire y más a menudo en las grietas parece correcto en su timonera.
Alan Wolfe
@AlanWolfe gracias por la sugerencia: he agregado algunas imágenes más en base a eso.
trichoplax
exponencial me parece mejor que el lineal o el basado en la distribución normal, pero no tengo ninguna respuesta que no sea de opinión para respaldar nada sobre la corrección: P
Alan Wolfe
¿Qué tal un autómata celular de algún tipo? Difusión paso y luego erosionan difusa luego erosionan ...
joojaa

Respuestas:

2

Vea el artículo Computer Modeling of Fallen Snow publicado en SIGGRAPH 2000:

En este artículo, presentamos un nuevo modelo de acumulación de nieve y estabilidad para gráficos por computadora. Nuestra contribución se divide en dos componentes principales, cada uno esencial para modelar la apariencia de una gruesa capa de nieve en el suelo. Nuestro modelo de acumulación determina la cantidad de nieve que recibe una superficie en particular, permitiendo fenómenos tales como aleteo de copos, polvo de copos y nieve soplada por el viento. Calculamos la acumulación de nieve disparando partículas hacia arriba hacia el cielo, dando a cada superficie de fuente un control independiente sobre su propia densidad de muestreo, precisión y tiempo de cálculo. El orden de importancia minimiza el esfuerzo de muestreo al tiempo que maximiza la información visual, generando resultados globales que mejoran sin problemas y que pueden interrumpirse en cualquier momento. Una vez que la nieve cae en el suelo, Nuestro modelo de estabilidad aleja el material de las áreas físicamente inestables en una serie de pequeñas avalanchas simultáneas. Utilizamos una prueba de estabilidad local simple que maneja superficies muy empinadas, obstáculos, bordes y tránsito de viento. Nuestro algoritmo de estabilidad también maneja otros materiales, como harina, arena y agua corriente.

Su página de proyecto contiene explicaciones e imágenes de ejemplo. Un PDF está aquí .

Un artículo anterior es Simulación de acumulación de polvo , publicado en IEEE Computer Graphics & Applications en 1995:

Este artículo describe una técnica de modelado de polvo. Se utiliza un método empírico para simular visualmente el efecto de la acumulación de polvo en las superficies de los objetos. La cantidad de polvo se predice primero en función de las propiedades de las superficies: la inclinación de la superficie y la adherencia. Esta cantidad prevista se ajusta de acuerdo con algunos factores externos: exposición de la superficie al viento y raspado por otros objetos. La cantidad de polvo calculada finalmente se ve perturbada por una función de ruido en el renderizado para dar un efecto visual difuso.

lhf
fuente