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:
Reducción exponencial de la densidad del polvo (nivel de fondo cero):
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.
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:
- ¿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.
- ¿Existe una interpretación física que justifique el uso de una de estas distribuciones, o que sugiera una mejor?
fuente
Respuestas:
Vea el artículo Computer Modeling of Fallen Snow publicado en SIGGRAPH 2000:
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:
fuente