Интуитивно понятно, что пыль оседает на поверхности с большей скоростью в областях, где поток воздуха медленнее. Это означает, что вместо поверхности, собирающей ровный слой пыли, в углах будет больше - углы комнаты / полки, углы, образованные размещением объектов на поверхности, вогнутости на поверхности.
Я могу добиться увеличения реализма, просто уменьшив толщину / плотность пыли по мере удаления от объекта и комбинируя этот эффект для нескольких объектов, включая стены. Это естественно дает ожидаемый порядок толщины - на краях пола больше пыли, чем в центре, а на углах, где встречаются края, больше пыли, чем в центре краев. Тем не менее, увеличение реалистичности от получения правильного порядка все еще оставляет проблему правильного соотношения. В местах, где вы ожидаете, будет больше пыли, но больше пыли, но не обязательно в нужном количестве больше.
Существует ли установленный метод аппроксимации реалистичного соотношения толщины между различными точками на поверхности? Мне не нужно, чтобы это было полностью физически точным (это должно было бы учитывать объекты, которые перемещаются в окружающей среде в течение длительного периода времени, необходимого для накопления пыли). Я просто ищу среднее поведение, которое будет выглядеть правдоподобным для человеческого глаза.
При поиске в Интернете я в основном нашел атмосферные модели для взвешенной пыли, а не способ моделирования осаждения пыли на поверхности.
Мои попытки - линейные и экспоненциальные распределения
Вот некоторый код в Python 3, использующий подушку (форк PIL), который демонстрирует несколько дистрибутивов, с которыми я экспериментировал:
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'
)
Представьте, что вы смотрите сверху на белую полку, на которой стоят стаканы. Через некоторое время очки снимаются, чтобы оставить свободные от пыли круглые области и распределение пыли по остальной части полки. Пыль зависит от расположения очков, задней и боковых стенок. Передняя часть полки (нижняя часть изображения) открыта, без стены для увеличения пыли.
Вывод
(Нажмите для увеличения изображения)
Линейное снижение плотности пыли плюс постоянный фоновый уровень пыли:
Экспоненциальное снижение плотности пыли (нулевой уровень фона):
Я ожидал, что экспоненциальная версия будет ближе к реальности, и я предпочитаю результат визуально. Тем не менее, я до сих пор не знаю, достаточно ли это близко.
Следуя предложению Алана Вулфа о нормальном распределении, я также добавил изображения, использующие их exp(-distance ** 2)
в различных масштабах.
Мне это тоже очень нравится, но я до сих пор не могу догадаться, какой из них и экспоненциальный ( exp(-distance)
) лучше.
Я ищу отзывы двумя способами:
- Какой-нибудь из этих дистрибутивов выглядит правильным / естественным для вас? Мне нужен вклад от более широкого круга человеческих глаз, в идеале с конкретными проблемами / несоответствиями.
- Существует ли физическая интерпретация, которая оправдывала бы использование одного из этих распределений, или предлагала бы лучшее?