13 - 均匀参与介质¶
HomogeneousMedium 描述一个封闭区域内处处相同的吸收、散射和热发射,可用于烟雾、浑浊水体或高温气体的辐射模拟。LESS 计算辐射在介质中的传输,不模拟流动、化学反应或温度随时间的变化。
创建介质¶
介质区域同样由封闭网格 TurbidBoundary 界定。边界本身不反射、不折射,只标记介质的范围:
import less
scene = less.Scene()
scene.size = 20
scene.illumination = less.Illumination(
source=less.Sun(irradiance=0), atmosphere=less.NoAtmosphere()) # 不考虑太阳,只看热发射
volume = less.Object("hot_volume")
volume.add_component("volume", less.TurbidBoundary(less.asset_path("homogeneous_slab.obj")))
volume.set_property("volume", less.HomogeneousMedium(
absorption=0.3, scattering=0.1, g=0.2, temperature=800))
scene.add(volume, positions=[(10, 10, 0)])
| 参数 | 含义 |
|---|---|
absorption |
吸收系数 a(m⁻¹) |
scattering |
散射系数 b(m⁻¹) |
g |
Henyey–Greenstein 不对称因子,−1 < g < 1;g > 0 为前向散射 |
temperature |
温度(K);给出时介质按局地热平衡发射,None 表示不发射 |
wavelengths |
系数为光谱数组时对应的波长(nm) |
沿路径长度 d 的直射透过率为 exp(−(a+b)d)。散射光还会再次进入观测方向,因此观测到的辐亮度一般大于直射透过的部分。
光谱系数¶
系数可以随波长变化:
medium = less.HomogeneousMedium(
wavelengths=[850, 4000, 10000],
absorption=[0.02, 0.2, 0.1],
scattering=[0.04, 0.024, 0.01],
g=0.3,
temperature=1800,
)
系数在给定波长之间线性插值,传感器的所有波长都必须落在给定的范围内。热发射源项为 a(λ)·B(λ, T),B 为普朗克函数,因此没有吸收就没有发射。对于不散射、温度均匀、厚度为 d 的介质层:
光学成像和热红外成像使用同一组系数,所以高温介质在近红外也能看到热发射。
成像¶
projection = less.Perspective(image_size=256, fov=22,
position=(20, -20, 6), target=(10, 10, 5))
near_infrared = scene.simulate(less.OpticalImager(projection, bands=[850], quality=64))
mid_infrared = scene.simulate(less.ThermalImager(projection, bands=[4000], quality=64,
mode="property"))
near_infrared.save("medium_850nm.tif")
mid_infrared.save("medium_4000nm.png")
scene.save("medium.less")
修改吸收、散射、g 或温度后直接再次模拟即可。
多个均匀介质区域可以相邻或重叠,重叠处的系数相加。介质也可以和统计植被出现在同一场景中,但两者不能在空间上重叠。
内置示例¶
python -m less.examples.homogeneous_medium --case slab --backend embree
python -m less.examples.homogeneous_medium --case regions --backend optix
regions 示例包含三个相邻的介质层,温度分别为 300、280 和 260 K,输出 850 nm 和 4000 nm 的影像。