2. 光源建模基础:点光源、面光源、平行光、朗伯体光源、光源波长与功率设置
做杂散光分析,说白了就是跟光“过不去”——你要找到那些不该出现的光线是从哪来的。而这一切的起点,就是光源建模。
我见过不少新手,一上来就急着追光线,结果光源类型选错了,分析半天全是废的。所以这一章,咱们把 FRED 里最常用的几种光源模型掰开揉碎讲清楚。
2.1 点光源:最简单的起点
点光源,顾名思义,就是一个点发出的光。在 FRED 里,它是最基础的光源模型。你只需要指定位置和发光方向,光线就从那个点向四面八方射出去。
我在做星敏感器杂散光分析时,经常用点光源来模拟恒星。虽然恒星是个巨大的球,但距离足够远,在光学系统里就是个点。
- 位置 (Position):光源在三维空间中的坐标 (X, Y, Z)
- 发光方向 (Direction):光线发射的主方向,通常用矢量表示
- 光束角 (Beam Angle):光线发射的锥角范围,0° 表示全向
FRED 里创建点光源很简单:
-- 创建一个位于 (0, 0, 100) 的点光源
local source = fred.SourcePoint()
source:SetPosition(0, 0, 100)
source:SetDirection(0, 0, -1) -- 指向 -Z 方向
source:SetBeamAngle(180) -- 全向发光
2.2 面光源:更接近真实
现实世界里,很少有真正的点光源。LED、显示屏、出射光瞳……这些都是面光源。FRED 里的面光源允许你定义一个发光面,光线从面上每个点发出。
面光源有两种常见模式:
| 模式 | 说明 | 典型应用 |
|---|---|---|
| 均匀发光 | 面上每个点发出的光线数量相同 | 模拟均匀背光板、积分球出光口 |
| 高斯分布 | 中心亮、边缘暗,符合高斯函数 | 模拟激光光束、光纤出光 |
创建面光源时,你需要先定义一个几何面(矩形、圆形、多边形等),然后把它指定为光源。
-- 创建一个矩形面光源
local rect = fred.GeometryRectangle(10, 10) -- 10mm x 10mm
rect:SetPosition(0, 0, 50)
local source = fred.SourceFromGeometry(rect)
source:SetRayCount(10000) -- 发射 10000 条光线
2.3 平行光:模拟无穷远
平行光,就是所有光线都沿着同一个方向传播。它用来模拟太阳光、激光准直光束,或者无穷远处的目标。
FRED 里的平行光其实是个“假平行”——它本质上是一个大尺寸的面光源,但所有光线都指向同一个方向。你想想看,太阳那么大,照到地球上不就是平行光吗?
设置平行光时,最重要的参数是:
- 光束直径 (Beam Diameter):决定了照亮区域的大小
- 入射方向 (Incident Direction):光线传播的矢量方向
- 倾斜角度 (Tilt Angle):相对于光轴的偏转角
-- 创建一个直径 50mm 的平行光,沿 -Z 方向入射
local source = fred.SourceCollimated()
source:SetBeamDiameter(50)
source:SetDirection(0, 0, -1)
2.4 朗伯体光源:最自然的发光体
朗伯体光源,说白了就是“从哪个角度看亮度都一样”的光源。白纸、毛玻璃、积分球内壁,这些都是近似朗伯体。
它的核心特征是:发光强度随角度按余弦分布。也就是说,垂直方向最亮,越倾斜越暗。
FRED 里设置朗伯体光源,通常是在面光源的基础上,把发光角度分布改成朗伯分布:
-- 创建一个朗伯体面光源
local source = fred.SourceLambertian()
source:SetGeometry(rect) -- 使用之前创建的矩形几何体
source:SetRayCount(50000)
我在做杂散光分析时,经常用朗伯体来模拟被照亮的散射表面。比如,镜筒内壁被杂散光照亮了,它反射出去的光就近似朗伯体。
- 普通面光源:每个点向各个方向发出的光线数量相同
- 朗伯体光源:每个点发出的光线数量随角度余弦变化
- 实际效果:朗伯体看起来更“自然”,边缘不会突然变暗
2.5 光源波长与功率设置
光不只是几何问题,还有“颜色”和“能量”。在 FRED 里,波长和功率是两个必须设置的参数。
波长设置
FRED 支持单波长和多波长两种模式:
| 模式 | 设置方式 | 适用场景 |
|---|---|---|
| 单波长 | 直接指定一个波长值(单位:nm) | 激光、单色 LED、窄带滤光片测试 |
| 多波长 | 指定多个波长及对应的权重 | 白光 LED、太阳光、宽光谱系统 |
-- 单波长设置:632.8nm(氦氖激光)
source:SetWavelength(632.8)
-- 多波长设置:模拟白光 LED
source:SetWavelengths({450, 550, 650}) -- 波长列表
source:SetWeights({0.3, 0.4, 0.3}) -- 对应权重
功率设置
功率决定了每条光线携带多少能量。FRED 里功率的单位是瓦特 (W)。
设置功率时,有个概念要搞清楚:总功率 vs 每条光线的功率。
- 总功率 (Total Power):光源发出的总能量,FRED 会自动分配到每条光线上
- 每条光线功率 (Ray Power):总功率 ÷ 光线数量
-- 设置总功率为 1W,发射 10000 条光线
source:SetTotalPower(1.0)
source:SetRayCount(10000)
-- 此时每条光线功率 = 1.0 / 10000 = 0.0001W
2.6 知识结构总览
下面这张图把本章的核心知识点串起来了,方便你对照复习:
2.7 本章小结
光源建模是杂散光分析的地基。地基没打好,上面盖的房子再漂亮也是危房。
我个人习惯是:拿到一个分析任务,先花 10 分钟想清楚“这个光源到底该用什么模型”。是点还是面?是平行还是朗伯?波长是单色还是宽谱?功率是多少?
这些问题想清楚了,后面的追迹和分析才能有的放矢。别急着点“Run”,先问问自己:我的光源设对了吗?