Существует ли установленный метод аппроксимации распределения пыли на поверхностях?

8

Интуитивно понятно, что пыль оседает на поверхности с большей скоростью в областях, где поток воздуха медленнее. Это означает, что вместо поверхности, собирающей ровный слой пыли, в углах будет больше - углы комнаты / полки, углы, образованные размещением объектов на поверхности, вогнутости на поверхности.

Я могу добиться увеличения реализма, просто уменьшив толщину / плотность пыли по мере удаления от объекта и комбинируя этот эффект для нескольких объектов, включая стены. Это естественно дает ожидаемый порядок толщины - на краях пола больше пыли, чем в центре, а на углах, где встречаются края, больше пыли, чем в центре краев. Тем не менее, увеличение реалистичности от получения правильного порядка все еще оставляет проблему правильного соотношения. В местах, где вы ожидаете, будет больше пыли, но больше пыли, но не обязательно в нужном количестве больше.

Существует ли установленный метод аппроксимации реалистичного соотношения толщины между различными точками на поверхности? Мне не нужно, чтобы это было полностью физически точным (это должно было бы учитывать объекты, которые перемещаются в окружающей среде в течение длительного периода времени, необходимого для накопления пыли). Я просто ищу среднее поведение, которое будет выглядеть правдоподобным для человеческого глаза.

При поиске в Интернете я в основном нашел атмосферные модели для взвешенной пыли, а не способ моделирования осаждения пыли на поверхности.

Мои попытки - линейные и экспоненциальные распределения

Вот некоторый код в 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)) лучше.

Я ищу отзывы двумя способами:

  1. Какой-нибудь из этих дистрибутивов выглядит правильным / естественным для вас? Мне нужен вклад от более широкого круга человеческих глаз, в идеале с конкретными проблемами / несоответствиями.
  2. Существует ли физическая интерпретация, которая оправдывала бы использование одного из этих распределений, или предлагала бы лучшее?
Trichoplax
источник
1
Вы пробовали нормальное распределение (функция Гаусса)? Кажется, что это помогло бы здесь, поскольку оно используется, чтобы выяснить, где вещи будут в среднем с определенными характеристиками вероятностей. Пыль оседает случайным образом, но реже там, где больше воздушного потока и чаще в щелях, кажется прямо в ее рубке.
Алан Вульф
@AlanWolfe спасибо за предложение - я добавил еще несколько изображений на основе этого.
трихоплакс
Экспонента выглядит для меня лучше, чем линейная или основанная на нормальном распределении, но у меня нет ответов, не основанных на мнении, чтобы подтвердить правоту: P
Алан Вулф
Как насчет клеточных автоматов? Диффузионный шаг, а затем
эрозия,

Ответы:

2

См. Статью « Компьютерное моделирование выпавшего снега», опубликованную в SIGGRAPH 2000:

В этой статье мы представляем новую модель накопления снега и устойчивости для компьютерной графики. Наш вклад разделен на два основных компонента, каждый из которых необходим для моделирования появления толстого слоя снегопада на земле. Наша модель накопления определяет, сколько снега получает конкретная поверхность, учитывая такие явления, как трепетание чешуек, пылеобразование и снежный ветер. Мы рассчитываем накопление снега, снимая частицы вверх к небу, предоставляя каждой поверхности источника независимый контроль над собственной плотностью выборки, точностью и временем вычислений. Порядок важности сводит к минимуму усилия по выборке при максимальном увеличении визуальной информации, создавая плавные улучшения глобальных результатов, которые могут быть прерваны в любой момент. Когда снег падает на землю, наша модель устойчивости перемещает материал из физически нестабильных областей в серии небольших одновременных лавин. Мы используем простой локальный тест на устойчивость, который обрабатывает очень крутые поверхности, препятствия, ребра и ветровой транспорт. Наш алгоритм устойчивости также обрабатывает другие материалы, такие как мука, песок и проточная вода.

Его страница проекта содержит пояснения и примеры изображений. PDF здесь .

Более старая статья под названием « Имитация накопления пыли» , опубликованная в IEEE Computer Graphics & Applications в 1995 году:

Эта статья описывает метод моделирования пыли. Эмпирический метод используется для визуального моделирования эффекта накопления пыли на поверхности объекта. Количество пыли сначала прогнозируется на основе свойств поверхностей: наклон поверхности и липкость. Это прогнозируемое количество затем корректируется в соответствии с некоторыми внешними факторами: поверхностное воздействие ветра и соскабливание другими объектами. Вычисленное количество пыли в конце концов возмущается шумовой функцией при рендеринге, что дает размытый визуальный эффект.

LHF
источник