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 条光线
我曾经踩过的坑:面光源的采样数量很重要。光线太少,结果会有明显的“颗粒感”;光线太多,追迹时间成倍增加。我的经验是:先跑 1000 条看趋势,确认没问题了再增加到 10 万条做最终分析。

2.3 平行光:模拟无穷远

平行光,就是所有光线都沿着同一个方向传播。它用来模拟太阳光、激光准直光束,或者无穷远处的目标。

FRED 里的平行光其实是个“假平行”——它本质上是一个大尺寸的面光源,但所有光线都指向同一个方向。你想想看,太阳那么大,照到地球上不就是平行光吗?

设置平行光时,最重要的参数是:

  • 光束直径 (Beam Diameter):决定了照亮区域的大小
  • 入射方向 (Incident Direction):光线传播的矢量方向
  • 倾斜角度 (Tilt Angle):相对于光轴的偏转角
-- 创建一个直径 50mm 的平行光,沿 -Z 方向入射
local source = fred.SourceCollimated()
source:SetBeamDiameter(50)
source:SetDirection(0, 0, -1)
避坑指南:做太阳杂散光分析时,平行光的直径一定要大于系统入瞳直径。我一般会设成入瞳直径的 1.5 倍,确保边缘光线也能覆盖到。

2.4 朗伯体光源:最自然的发光体

朗伯体光源,说白了就是“从哪个角度看亮度都一样”的光源。白纸、毛玻璃、积分球内壁,这些都是近似朗伯体。

它的核心特征是:发光强度随角度按余弦分布。也就是说,垂直方向最亮,越倾斜越暗。

FRED 里设置朗伯体光源,通常是在面光源的基础上,把发光角度分布改成朗伯分布:

-- 创建一个朗伯体面光源
local source = fred.SourceLambertian()
source:SetGeometry(rect)  -- 使用之前创建的矩形几何体
source:SetRayCount(50000)

我在做杂散光分析时,经常用朗伯体来模拟被照亮的散射表面。比如,镜筒内壁被杂散光照亮了,它反射出去的光就近似朗伯体。

朗伯体 vs 普通面光源:
  • 普通面光源:每个点向各个方向发出的光线数量相同
  • 朗伯体光源:每个点发出的光线数量随角度余弦变化
  • 实际效果:朗伯体看起来更“自然”,边缘不会突然变暗

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
注意:功率设置直接影响杂散光分析的定量结果。如果你只是看“有没有杂散光”,功率设成 1W 就行。但如果你要计算“杂散光有多强”,就必须用真实的光源功率值。我曾经帮客户排查一个红外系统的问题,就是因为他们把光源功率设错了,导致分析结果跟实测差了 10 倍。

2.6 知识结构总览

下面这张图把本章的核心知识点串起来了,方便你对照复习:

光源建模知识结构图 光源建模核心知识结构 FRED 光源建模 点光源 面光源 平行光 朗伯体光源 位置 / 方向 / 光束角 模拟恒星、小尺寸光源 均匀发光 / 高斯分布 需定义几何面 + 采样数 光束直径 / 入射方向 模拟太阳、无穷远目标 强度按余弦分布 模拟散射表面、毛玻璃 公共参数:波长 & 功率 单波长 / 多波长 + 权重 总功率 / 每条光线功率 💡 核心原则:先选对光源类型,再设波长和功率 快速验证用点光源,定量分析用真实模型

2.7 本章小结

光源建模是杂散光分析的地基。地基没打好,上面盖的房子再漂亮也是危房。

我个人习惯是:拿到一个分析任务,先花 10 分钟想清楚“这个光源到底该用什么模型”。是点还是面?是平行还是朗伯?波长是单色还是宽谱?功率是多少?

这些问题想清楚了,后面的追迹和分析才能有的放矢。别急着点“Run”,先问问自己:我的光源设对了吗?