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:
Pengurangan kepadatan debu secara eksponensial (tingkat latar belakang nol):
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.
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:
- 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.
- Apakah ada interpretasi fisik yang akan membenarkan menggunakan salah satu distribusi ini, atau yang akan menyarankan yang lebih baik?
sumber
Jawaban:
Lihat makalah Computer Modeling of Fallen Snow yang diterbitkan dalam SIGGRAPH 2000:
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:
sumber