凭直觉,灰尘在空气流动较慢的区域以较高的速率沉积在表面上。这意味着,不是在表面上聚集均匀的灰尘层,而是在拐角处有更多的东西-房间/架子的拐角,由物体在表面上的放置形成的拐角,表面的凹面。 >只要使灰尘的厚度/密度随与物体的距离而减小,并将这种效果结合到包括墙壁在内的多个物体上,我就可以增加真实感。这自然给出了预期的厚度顺序-地板的边缘比中心的灰尘多,与边缘交汇的角落的灰尘比边缘的中心多。然而,由于顺序正确而增加了现实性,仍然存在使比率正确的问题。在您希望有更多灰尘的地方有更多灰尘,但不一定有更多的灰尘。

是否存在一种确定表面上不同点之间的实际厚度比的近似方法?我不需要这在物理上是完全准确的(这需要考虑到在很长一段时间内灰尘会累积在环境中移动的物体)。我只是在寻找可以让人眼相信的平均行为。

在线搜索中,我发现的主要是大气模型中的悬浮尘埃,而不是一种模拟表面尘埃沉积的方法。

我的尝试-线性分布和指数分布

以下是Python 3中使用枕头(PIL叉)的一些代码,展示了我尝试过的几个分布: br />
 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'
                      )
 


想象一下,从上面往下看,在上面放了水杯的白色架子上。一段时间后,将玻璃杯移开,留下无尘的圆形区域,并在其余架子上散布灰尘。灰尘会受到玻璃以及后壁和侧壁位置的影响。架子的前部(图片的底部)是开放的,没有墙壁以增加灰尘。 />线性降低粉尘密度加上恒定的粉尘背景水平:






指数级减少粉尘密度(零背景水平):





我期望指数版本更接近现实我从视觉上更喜欢结果。但是,我仍然不知道这是否足够接近。

根据Alan Wolfe关于正态分布的建议,我还使用了exp(-distance ** 2)以各种比例添加了图像。 br />




我也很喜欢,但是我仍然无法猜出哪个和指数(exp(-distance))最好。

我正在通过两种方式寻求反馈:我希望从更广泛的人眼获得输入,理想情况下是存在特定问题/矛盾之处。
是否存在一种物理解释可以证明使用这些分布之一是合理的,还是建议使用更好的分布?


评论

您是否尝试过正态分布(高斯函数)?似乎它在这里会有所帮助,因为它用于确定事物在某些概率特征下的平均位置。尘土随机分布,但在空气流动较多且缝隙中较多的地方出现的频率似乎较低,这在其驾驶室中似乎是正确的。

@AlanWolfe感谢您的建议-我在此基础上添加了更多图像。

对我而言,指数看起来比基于线性或正态分布的指数更好,但我没有任何无意见的答案可以证明正确性:P

某种细胞自动机怎么样?扩散步骤然后侵蚀扩散然后侵蚀...

#1 楼

请参阅SIGGRAPH 2000中发表的论文《降雪的计算机建模》:


在本文中,我们提出了一种新的积雪和计算机图形学稳定性模型。我们的贡献分为两个主要部分,每个部分对于模拟地面上厚厚的降雪层的外观至关重要。我们的累积模型确定特定表面接收的积雪量,从而允许出现片状飘动,片状扬尘和风吹雪等现象。我们通过向上射向天空的粒子来计算积雪,从而使每个源表面都可以独立控制其自身的采样密度,准确性和计算时间。重要性排序可最大程度地减少采样工作,同时最大化可视信息,从而平稳地改善全局结果,该结果可随时中断。一旦降雪降落在地面上,我们的稳定性模型就会在一系列小的同时发生的雪崩中将物质从物理不稳定的区域移开。我们使用简单的局部稳定性测试来处理非常陡峭的表面,障碍物,边缘和风传播。我们的稳定性算法还可以处理其他材料,例如面粉,沙子和流水。


其项目页面包含说明和示例图像。 PDF在这里。

1995年发表在IEEE计算机图形学和应用程序上的一篇较旧的论文是《模拟灰尘积累》: 。一种经验方法用于直观地模拟灰尘在物体表面堆积的效果。首先根据表面的特性(表面的倾斜度和粘性)预测粉尘量。然后根据一些外部因素调整此预测量:表面暴露在风中以及被其他物体刮擦。最终,计算出的粉尘量在渲染时受到噪声函数的干扰,从而产生模糊的视觉效果。