Có một phương pháp xác lập gần đúng phân phối bụi trên các bề mặt?


8

Theo trực giác, bụi lắng xuống các bề mặt với tốc độ cao hơn ở những khu vực có luồng không khí chậm hơn. Điều này có nghĩa là thay vì một bề mặt tập hợp một lớp bụi đồng đều, sẽ có nhiều hơn ở các góc - góc của một căn phòng / kệ, các góc được hình thành bởi sự đặt các vật thể trên một bề mặt, các vị trí trên bề mặt.

Tôi có thể tăng sự chân thực chỉ bằng cách làm giảm độ dày / mật độ của bụi với khoảng cách từ một vật thể và kết hợp hiệu ứng đó cho một số vật thể bao gồm cả các bức tường. Điều này tự nhiên đưa ra thứ tự độ dày dự kiến ​​- các cạnh của sàn có nhiều bụi hơn so với trung tâm, các góc mà các cạnh gặp nhau có nhiều bụi hơn là trung tâm của các cạnh. Tuy nhiên, sự gia tăng của chủ nghĩa hiện thực từ việc đặt hàng đúng vẫn để lại vấn đề làm cho tỷ lệ đúng. Có nhiều bụi ở những nơi bạn mong đợi có nhiều bụi hơn, nhưng không nhất thiết phải đúng số lượng nhiều hơn.

Is there an established method of approximating a realistic ratio of thickness between different points on a surface? I don't need this to be completely physically accurate (that would need to take into account objects that move through the environment during the long period taken for dust to accumulate). I'm just looking for average behaviour that will look believable to the human eye.

Khi tìm kiếm trực tuyến, tôi hầu như đã tìm thấy các mô hình khí quyển cho bụi lơ lửng, thay vì cách mô hình lắng đọng bụi trên bề mặt.

Nỗ lực của tôi - phân phối tuyến tính và cấp số nhân

Dưới đây là một số mã trong Python 3 sử dụng gối (ngã ba PIL) thể hiện một vài bản phân phối mà tôi đã thử nghiệm:

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

Hãy tưởng tượng nhìn từ trên cao xuống một cái kệ màu trắng có đặt ly uống nước trên đó. Một thời gian sau, kính được tháo ra để lại các vùng hình tròn không có bụi và phân phối bụi trên phần còn lại của kệ. Bụi bị ảnh hưởng bởi các vị trí của kính và các bức tường phía sau và bên. Mặt trước của kệ (dưới cùng của hình ảnh) là mở, không có tường để tăng bụi.

Đầu ra

(Bấm vào để xem hình ảnh lớn hơn)

Giảm tuyến tính mật độ bụi cộng với mức bụi không đổi của nền:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Giảm theo cấp số nhân mật độ bụi (mức nền bằng 0):

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Tôi dự kiến ​​phiên bản theo cấp số nhân sẽ gần với thực tế hơn và tôi thích kết quả một cách trực quan hơn. Tuy nhiên, tôi vẫn không biết điều này có đủ gần không.

Theo đề xuất của Alan Wolfe về phân phối bình thường, tôi cũng đã thêm hình ảnh bằng exp(-distance ** 2)nhiều tỷ lệ khác nhau.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Tôi cũng khá thích điều này, nhưng tôi vẫn không thể đoán được cái nào trong số này và hàm mũ ( exp(-distance)) là tốt nhất.

Tôi đang tìm kiếm phản hồi theo hai cách:

  1. Có bất kỳ phân phối nào trông đúng / tự nhiên với bạn không? Tôi muốn đầu vào từ một phạm vi rộng hơn của mắt người, lý tưởng với các vấn đề / sự không nhất quán cụ thể.
  2. Có một giải thích vật lý nào có thể biện minh cho việc sử dụng một trong những phân phối này, hoặc điều đó sẽ gợi ý một cách phân phối tốt hơn?

1
Bạn đã thử phân phối bình thường (hàm Gaussian) chưa? Có vẻ như nó sẽ giúp ích ở đây vì nó được sử dụng để tìm ra nơi mọi thứ sẽ ở mức trung bình với các đặc điểm nhất định của xác suất. Bụi lắng xuống ngẫu nhiên nhưng ít thường xuyên hơn khi có nhiều luồng không khí và thường xuyên hơn trong các kẽ hở dường như ngay trong buồng lái của nó.
Alan Wolfe

@AlanWolfe cảm ơn vì lời đề nghị - Tôi đã thêm vào một số hình ảnh khác dựa trên đó.
trichoplax

exponential looks better to me than linear or the normal distribution based one, but i don't have any non opinion answers to back anything up about correctness :P
Alan Wolfe

Làm thế nào về một automata di động của một số loại? Bước khuếch tán và sau đó ăn mòn khuếch tán rồi xói mòn ...
joojaa

Câu trả lời:


2

Xem bài viết Mô hình máy tính của Fallen Snow được xuất bản trong SIGGRAPH 2000:

Trong bài báo này, chúng tôi trình bày một mô hình mới về tích lũy và ổn định tuyết cho đồ họa máy tính. Đóng góp của chúng tôi được chia thành hai thành phần chính, mỗi thành phần cần thiết để mô hình hóa sự xuất hiện của một lớp tuyết dày trên mặt đất. Mô hình tích lũy của chúng tôi xác định lượng tuyết mà một bề mặt cụ thể nhận được, cho phép các hiện tượng như rung vảy, phủ bụi và tuyết thổi. Chúng tôi tính toán tích lũy tuyết bằng cách bắn các hạt hướng lên trời, cho mỗi bề mặt nguồn kiểm soát độc lập với mật độ lấy mẫu, độ chính xác và thời gian tính toán của chính nó. Thứ tự quan trọng giảm thiểu nỗ lực lấy mẫu trong khi tối đa hóa thông tin hình ảnh, tạo ra kết quả toàn cầu một cách trơn tru có thể bị gián đoạn bất cứ lúc nào. Khi tuyết rơi trên mặt đất, mô hình ổn định của chúng tôi di chuyển vật liệu ra khỏi các khu vực không ổn định về thể chất trong một loạt các trận tuyết lở nhỏ, đồng thời. Chúng tôi sử dụng một bài kiểm tra ổn định cục bộ đơn giản để xử lý các bề mặt rất dốc, chướng ngại vật, các cạnh và vận chuyển gió. Thuật toán ổn định của chúng tôi cũng xử lý các vật liệu khác, như bột, cát và nước chảy.

Trang dự án của nó chứa các giải thích và hình ảnh ví dụ. Một bản PDF ở đây .

Một bài báo cũ hơn là Mô phỏng tích lũy bụi , được xuất bản trên Ứng dụng & Đồ họa máy tính của IEEE năm 1995:

Bài viết này mô tả một kỹ thuật mô hình bụi. Một phương pháp thực nghiệm được sử dụng để mô phỏng trực quan hiệu quả tích tụ bụi trên bề mặt vật thể. Lượng bụi được dự đoán đầu tiên dựa trên đặc tính của các bề mặt: độ nghiêng và độ dính bề mặt. Lượng dự đoán này sau đó được điều chỉnh theo một số yếu tố bên ngoài: tiếp xúc bề mặt với gió và cạo các vật thể khác. Lượng bụi tính toán cuối cùng bị nhiễu bởi chức năng nhiễu trên kết xuất để tạo hiệu ứng hình ảnh mờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.