Apakah ada metode yang mapan untuk memperkirakan distribusi debu pada permukaan?

8

Secara intuitif, debu mengendap di permukaan dengan kecepatan lebih tinggi di area di mana aliran udara lebih lambat. Ini berarti alih-alih permukaan mengumpulkan lapisan debu yang rata, akan ada lebih banyak di sudut - sudut ruangan / rak, sudut yang dibentuk oleh penempatan objek di permukaan, cekung di permukaan.

Saya bisa mendapatkan peningkatan dalam realisme hanya dengan membuat ketebalan / kepadatan debu berkurang dengan jarak dari suatu objek, dan menggabungkan efek itu untuk beberapa objek termasuk dinding. Ini secara alami memberikan urutan ketebalan yang diharapkan - ujung-ujung lantai memiliki lebih banyak debu daripada bagian tengah, sudut-sudut tempat ujung bertemu memiliki lebih banyak debu daripada bagian tengah tepi. Namun, peningkatan realisme dari mendapatkan pesanan yang benar masih menyisakan masalah untuk mendapatkan rasio yang tepat. Ada lebih banyak debu di tempat-tempat yang Anda harapkan memiliki lebih banyak debu, tetapi jumlah yang tepat tidak selalu lebih banyak.

Apakah ada metode yang mapan untuk memperkirakan rasio ketebalan yang realistis antara titik-titik berbeda di permukaan? Saya tidak perlu ini benar-benar akurat secara fisik (yang perlu memperhitungkan benda-benda yang bergerak melalui lingkungan selama periode yang lama diambil untuk menumpuk debu). Saya hanya mencari perilaku rata-rata yang akan terlihat dipercaya oleh mata manusia.

Dalam pencarian online, saya lebih sering menemukan model atmosfer untuk debu yang ditangguhkan, daripada cara memodelkan pengendapan debu di permukaan.

Upaya saya - distribusi linear dan eksponensial

Berikut adalah beberapa kode dalam Python 3 menggunakan bantal (garpu PIL) yang menunjukkan beberapa distribusi yang telah saya coba:

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

Bayangkan melihat ke bawah dari atas di rak putih yang memiliki gelas minum yang diletakkan di atasnya. Beberapa waktu kemudian kacamata dilepas untuk meninggalkan daerah lingkaran bebas debu dan distribusi debu di seluruh rak. Debu dipengaruhi oleh posisi kacamata dan dinding belakang dan samping. Bagian depan rak (bagian bawah gambar) terbuka, tanpa dinding untuk menambah debu.

Keluaran

(Klik untuk gambar yang lebih besar)

Pengurangan kepadatan debu secara linear ditambah tingkat latar belakang debu yang konstan:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Pengurangan kepadatan debu secara eksponensial (tingkat latar belakang nol):

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Saya berharap versi eksponensial lebih dekat dengan kenyataan, dan saya lebih suka hasilnya secara visual. Namun, saya masih tidak tahu apakah ini cukup dekat.

Mengikuti saran Alan Wolfe tentang distribusi normal, saya juga menambahkan gambar menggunakan exp(-distance ** 2)berbagai skala.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Saya juga suka ini, tapi saya masih tidak bisa menebak yang mana dan eksponensial ( exp(-distance)) yang terbaik.

Saya mencari umpan balik dalam dua cara:

  1. Apakah ada dari distribusi ini yang terlihat benar / alami bagi Anda? Saya ingin masukan dari mata manusia yang lebih luas, idealnya dengan masalah / ketidakkonsistenan tertentu.
  2. Apakah ada interpretasi fisik yang akan membenarkan menggunakan salah satu distribusi ini, atau yang akan menyarankan yang lebih baik?
trichoplax
sumber
1
Sudahkah Anda mencoba distribusi normal (fungsi Gaussian)? Tampaknya itu akan membantu di sini karena digunakan untuk mencari tahu di mana hal-hal akan rata-rata dengan karakteristik probabilitas tertentu. Debu mengendap secara acak tetapi lebih jarang di mana ada lebih banyak aliran udara dan lebih sering di celah-celah tampaknya tepat di ruang kemudi.
Alan Wolfe
@AlanWolfe terima kasih atas sarannya - Saya telah menambahkan beberapa gambar berdasarkan itu.
trichoplax
Bagiku eksponensial lebih baik daripada linear atau yang berbasis distribusi normal, tetapi saya tidak punya jawaban pendapat untuk mendukung sesuatu tentang kebenaran: P
Alan Wolfe
Bagaimana dengan automata seluler? Langkah difusi lalu
erosi

Jawaban:

2

Lihat makalah Computer Modeling of Fallen Snow yang diterbitkan dalam SIGGRAPH 2000:

Dalam tulisan ini, kami menyajikan model baru akumulasi salju dan stabilitas untuk grafik komputer. Kontribusi kami dibagi menjadi dua komponen utama, masing-masing penting untuk memodelkan penampilan lapisan salju tebal di tanah. Model akumulasi kami menentukan berapa banyak salju yang diterima permukaan tertentu, memungkinkan fenomena seperti serpihan serpihan, debu serpihan dan salju yang tertiup angin. Kami menghitung akumulasi salju dengan menembakkan partikel ke atas ke arah langit, memberikan masing-masing permukaan sumber kontrol independen atas kerapatan, akurasi, dan waktu perhitungan sendiri. Urutan kepentingan meminimalkan upaya pengambilan sampel sambil memaksimalkan informasi visual, menghasilkan hasil global yang lancar yang dapat terganggu pada titik mana pun. Begitu salju mendarat di tanah, model stabilitas kami memindahkan material dari area yang tidak stabil secara fisik dalam serangkaian guguran kecil simultan. Kami menggunakan uji stabilitas lokal sederhana yang menangani permukaan yang sangat curam, hambatan, tepi, dan transit angin. Algoritma stabilitas kami juga menangani bahan lain, seperti tepung, pasir, dan air yang mengalir.

Its halaman proyek berisi penjelasan dan contoh gambar. PDF ada di sini .

Makalah yang lebih tua adalah Simulasi Akumulasi Debu , yang diterbitkan dalam IEEE Computer Graphics & Applications pada 1995:

Makalah ini menjelaskan teknik pemodelan debu. Metode empiris digunakan untuk mensimulasikan secara visual efek akumulasi debu pada permukaan objek. Jumlah debu diprediksi pertama kali berdasarkan sifat permukaan: kemiringan permukaan dan kekakuan. Jumlah yang diperkirakan ini kemudian disesuaikan menurut beberapa faktor eksternal: paparan permukaan terhadap angin dan dikikis oleh benda lain. Jumlah debu yang dihitung akhirnya terganggu oleh fungsi noise pada rendering untuk memberikan efek visual fuzzy.

lhf
sumber