接到一个镜头设计任务,客户只有一句话:“要看得清。”焦距多少、口径多大、工作在哪个波段、像面用多大探测器,统统没提。这时候如果打开Zemax就开始堆镜片,那基本等于拿大炮打蚊子转圈,折腾到半夜也得不到能用的结果。光学设计流程的价值,就是把人话翻译成可计算的指标,再一步步把指标变成真实可加工的结构。这篇文章我把Zemax从需求到出公差的完整流程拆开讲,配一个序列模式的折射式物镜案例和一个非序列模式的分光棱镜案例,最后聊五个我踩过不止一次的坑。适合刚接触Zemax、或者已经能跑通Demo但还不清楚整个设计流程的人。
1. 把模糊需求翻译成Zemax能懂的参数:波长、孔径与视场
1.1 波长设置:白光不是一条谱线
很多新手拿到Zemax,第一步就是直接把默认的可见光三色波长填进去,然后开始优化。这没错,但如果不知道为什么要这样设,后面出问题会无从下手。
人眼对555nm附近的绿光最敏感,所以单色光系统可以只算一个波长。但普通成像系统要覆盖白光,那就必须把F光(486.1nm)、d光(587.6nm)、C光(656.3nm)三条谱线同时放进去。原因很简单,玻璃的折射率随波长变化,同一个透镜对蓝光、绿光、红光的偏折能力不一样,这就形成色差。只用一条谱线做设计,白光一照,像质立刻崩,焦平面都找不到。
选波长还有另一个层含义:它直接决定你能用哪种玻璃组合来消色差。玻璃库里的阿贝数(V数)都是针对d光定义的,不同玻璃在F光和C光之间的色散差异,决定了消色差双胶合能不能成立。所以进入Zemax的第一件事,不是在镜片编辑器里填东西,而是在系统选项里把波长、权重、主波长定义清楚。
1.2 孔径:入瞳直径、F数与NA的关系
孔径决定一条系统能收进多少光,也直接决定衍射极限。成像系统里最常用的是F数,表达式是:
F# = f / D
其中f是焦距,D是入瞳直径。一个焦距100mm、入瞳直径20mm的镜头,F数就是5,也就是常说的F/5。F数越小,衍射极限对应的艾里斑半径越小,系统对像差的容错越低,加工公差也更紧——这个逻辑链要建立起来。
显微镜物镜这类近轴低倍系统更多用数值孔径NA,NA = n·sinθ,和F数之间的近似换算关系是F# ≈ 1 / (2NA),严格说应该考虑物方孔径角。红外、激光系统中还会涉及实际入瞳位置的问题,但刚起步时把F数和入瞳直径对应清楚就够了。Zemax里设置系统孔径,我推荐直接给定入瞳直径,然后在视场设置里用角度或像高,这样优化时焦距会自然收敛到设计值,逻辑最顺。
1.3 视场:用角度还是用像高
视场设置取决于系统的物在无穷远还是有限距离。无限远共轭(望远镜物镜、照相镜头)用视场角,比如半视场2度;有限共轭(显微镜、投影镜头)用像高,比如半像高5mm。
这里有一个新手特别容易踩的点:Zemax的视场设置里有“角度”和“像高”两种模式,如果你设成像高,还要确认近轴像高还是真实像高。用近轴像高做视场定义时,系统优化时容易产生畸变偏大的问题,因为边缘视场的主光线没有按真实像高约束。我习惯用角度定义全视场,再通过畸变操作数控制实际像高,或者反过来用真实像高定义,看个人偏好,但一定要知道区别。
视场点数的选取也有讲究。单纯0度和边缘两个视场太少,实际优化时中间视场容易失控,我一般至少设3个视场:中心、0.7视场、边缘视场。0.7视场是很多像差(尤其场曲和像散)的平衡位置,忽略它会掉进坑。
2. 初始结构从哪来?三种被验证有效的路径
2.1 缩放法:最快的捷径
拿到设计指标后,最省力的做法不是从零开始在纸上凑公式,而是找一个已经在用的、焦距接近的系统,按比例缩放。所谓缩放法,就是把原始设计的曲率半径、厚度、口径全部乘以一个比例因子,比例因子等于目标焦距除以原始焦距。
为什么这个方法有效?因为近轴区的赛德像差系数在缩放前后不改变符号和相对大小。也就是说,一个原始系统原本是球差小、彗差中等、色差平衡的,你把所有几何尺寸按同一比例放大缩小,除了衍射极限和相对孔径不变之外,像差分布模式会被完整保留下来。这就是为什么很多光学公司内部库里积累了成百上千个项目文件——它们都是下一次新设计的初始结构来源。
缩放时不要只缩放焦距,入瞳直径和视场也要同步对应。如果你把焦距从50mm放大到100mm,入瞳直径还保持在原来的10mm,那系统的F数就翻倍了,整个像差平衡全部失效。要时刻记住,F数和视场角决定系统的像差特性,焦距只是比例尺。
2.2 专利与经典镜头库检索
没有现成文件可参考的时候,专利是最庞大、最可靠的设计来源。美国专利商标局网站上直接搜“lens system”加上焦距范围、F数、视场角这几个关键词,能翻到一大批光学设计专利,Zemax专利库本身也内置了不少经典结构。这些专利都是经过优化、经过实际验证的,哪怕只是拿来做初始结构,也能让你少走大量弯路。
书籍方面,Rudolf Kingslake的《Lens Design Fundamentals》和Warren Smith的《Modern Optical Engineering》是我用了十多年的常备参考,里面有大量经典镜头的光焦度分配、半径、厚度数据。Zemax安装目录下也自带不少示例文件,很多人从来没打开看过。这些示例虽然不是从零开始,但用来理解“什么样的结构能实现什么样指标”特别直观。
2.3 薄透镜近似手算起步
实在找不到参考,就只能自己从薄透镜理论推。以最经典的双胶合消色差透镜为例,用薄透镜近似先分配光焦度,再定曲率半径。
设正透镜光焦度φ1,负透镜光焦度φ2,总光焦度Φ=φ1+φ2。消色差条件要求:
φ1/V1 + φ2/V2 = 0
其中V1、V2分别是两种玻璃的阿贝数。以BK7(V=64.17)和F2(V=36.37)组合为例,目标焦距100mm,即总光焦度Φ=0.01mm⁻¹,联立两个方程得到:
φ1 ≈ 0.02308mm⁻¹,φ2 ≈ -0.01308mm⁻¹
对应焦距f1≈43.3mm,f2≈-76.4mm。然后利用薄透镜公式:
1/f = (n-1)[1/R1 - 1/R2]
对称双凸正透镜,n1=1.5168,R2=-R1,推出R1≈2(n1-1)f1≈44.8mm,取45mm。负透镜同理,n2=1.62004,取R3≈-95mm。这样就算出了整个系统的初始半径,误差不大,足够Zemax的优化器接手。这一手算能力,看起来笨,实际在判断“系统有没有救”的时候极其好用。
3. 评价函数与操作数:让镜片自己变得更好
3.1 默认评价函数怎么选
Zemax的优化本质上是一个数值最小化过程:优化器调整变量,让评价函数(Merit Function)的值不断降低。评价函数反映的是“当前系统离目标状态差多远”,数值越低,说明越接近目标。
新手最常犯的错是直接在评价函数编辑器里乱加操作数,加了几十个约束,结果系统反而跑不出好结果。正确做法是先让Zemax自动生成默认评价函数,再在这个基础上补充少量关键约束。
默认评价函数生成时会问你用RMS还是PTV、用光斑半径还是波前误差。RMS比PTV更平滑,优化器不容易卡在局部极值;光斑半径适合大像差初始阶段,波前误差适合接近衍射极限的精细优化。我习惯分两轮:第一轮用RMS光斑半径把系统从“乱七八糟”拉到“基本能看”,第二轮改成RMS波前误差,或者直接用MTF相关操作数,把系统从“能看”推到“接近衍射极限”。
3.2 必备操作数清单
默认评价函数之外,有几个操作数几乎每个项目都要用到:
| 操作数 | 作用 | 典型用法 |
|---|---|---|
| EFFL | 控制有效焦距 | 目标设为设计值,权重按精度需求调整 |
| AXCL | 轴向色差 | 控制F光和C光焦点之差,目标0 |
| TRAY | 指定光线的Y方向像差 | 控制特定带区球差大小 |
| RSCE | RMS光斑半径 | 直接优化点列图收敛程度 |
| MTFT / MTFS | 子午/弧矢MTF值 | 让特定空间频率的对比度达标 |
| DIMX | 畸变百分比 | 控制畸变不超过允许范围 |
| OPDC | 波前差 | 精细优化时控制波前 |
拿EFFL举例,很多新手设了焦距约束但发现焦距总偏,原因就是EFFL没有设足够高的权重。焦距是系统最基础的参数,它跑了,后面所有视场、孔径的约束全乱。我的习惯是EFFL权重给到1,单位用mm,如果系统焦距100mm,目标偏差0.1mm内就够。
3.3 优化器选择与局部极值
Zemax的优化器有局部优化和全局优化(锤击优化)两种。局部优化沿着梯度方向快速下坡,但很可能停在某个山坳里——这个山坳就是“局部极值”,看着周围全是上坡,实际上整个山系里还有更低的谷。锤击优化会随机扰动变量,帮你跳出当前山谷,代价是收敛慢,不稳定。
正确的顺序是先局部优化,快速收敛;然后视情况跑几百轮锤击,观察评价函数有没有跳到更低的值;最后再回到局部优化精修一遍。整个过程通常重复两三个来回。锤击优化的结果有一定随机性,记住当前评价函数的值,多跑几次对比,取最优。
玻璃是否设为变量是个经典问题。允许玻璃替换可以大幅提升性能,但会让优化时间暴涨,而且结果经常是换成昂贵材料的组合,工厂看了报价直接摇头。合理的做法是先固定玻璃完成结构优化,如果性能实在达不到,再允许玻璃在有限候选玻璃库内替换。
4. 案例一:F/5双胶合消色差物镜从零到MTF达标
4.1 设计规格与初始结构设定
这个案例做一个经典的望远镜物镜,规格如下:
- 有效焦距100mm
- 入瞳直径20mm(F/5)
- 半视场角±2度
- 波长:F (486.1nm)、d (587.6nm)、C (656.3nm)
- 像质目标:RMS光斑半径小于25微米,MTF在50 lp/mm处大于0.5
玻璃选择BK7(冕牌正透镜)+ F2(火石负透镜)。这个组合色差校正能力和性价比都很均衡,加工也成熟。初始半径直接用2.3节手算结果:R1=45mm,R2=-45mm(胶合面),R3=-95mm。正透镜中心厚度6mm,负透镜中心厚度4mm,间距0(胶合)。
4.2 Zemax里的逐步设置与优化
先把系统孔径设为“入瞳直径”20mm,视场用角度,填入0度、1.4度、2度三个视场,波长选F/d/C三条线。然后在镜头数据编辑器里按顺序填入初始半径和厚度。
接下来是关键步骤:打开优化向导,默认评价函数选择RMS光斑半径,把光线数设为3环6臂(默认其实够用),生成的评价函数包含了覆盖全视场全孔径的光线抽样。额外加上两个操作数:
- EFFL,目标100,权重1
- AXCL,目标0,权重0.1
变量选择很讲究,不要一口气把什么都设为变量。第一轮我建议设为:R1、R2、R3三个曲率半径,以及最末一个“空气到像面”的距离(也就是后焦距)。两个透镜的中心厚度先固定,防止优化器把厚度压到离谱的负值或零。等第一轮收敛后再放开中心厚度,范围限制在2~8mm。
执行局部优化,观察评价函数变化。这个初值结构是比较接近最优域的,第一轮优化后RMS光斑半径很可能从几百微米量级直接压到二三十微米。如果评价函数卡住不动且光斑还很大,说明初值离最优域太远,先跑几百轮锤击优化看看能不能换一个更低的山谷。
4.3 结果验证与MTF判断
优化完成后不要急着高兴,先看三个东西:点列图、MTF曲线和赛德像差系数。
打开点列图,看到RMS光斑半径落在20微米以内,且中心和边缘视场差不多大,说明视场平衡做得还可以。把艾里斑半径算一下:λF#约等于0.5876μm×5≈2.9μm,这表示艾里斑很小,我们的光斑尺寸由剩余像差主导,还有像差余量要磨。
看MTF曲线,重点看空间频率50 lp/mm处,子午和弧矢两条曲线的平均值是否大于0.5。同时看低频段是否平滑,高频段有没有突然掉到零——那说明有离焦或其他残留像差。MTF曲线在衍射极限包络线附近密集排列,说明系统已经接近衍射极限,再往下优化收益不大。
最后打开赛德系数,看球差、彗差、像散、场曲、畸变五项。因为是双胶合,球差和轴向色差应该都被压得很低,主要残余是像散和场曲。如果彗差还有明显残余,检查一下是不是胶合面半径被优化跑偏了,或者视场权重设置不均导致边缘视场失控。这时候迭代调整操作数权重,就能稳定地走完整个设计。
5. 案例二:非序列模式下搭建分光棱镜并查看能量分布
5.1 为什么非序列模式绕不开
分光棱镜这类元件在序列模式下基本没法建。序列模式的光线严格按照面顺序追迹,入射面、出射面、下一面的顺序是固定的。但分光棱镜里光线一遇到胶合面上的分光膜,就分成透射和反射两路,一路往前走到像面,一路转90度走到另一个方向。这就是典型的非序列光学路径,光线可以和物体列表中任意物体相交,顺序由空间位置和几何形状决定,完全按真实物理过程追迹。
刚接触Zemax的人经常在序列模式下到处找插入棱镜的入口,折腾半天建出来一团乱。正确思路是直接切到非序列模式,用真正的体块对象建模。这也是回应很多人搜的“zemax非序列模式分光棱镜”那个问题的核心操作。
5.2 建模步骤:棱镜物体、分光膜、光源与探测器
第一步,新建一个非序列文件,物体列表中选择45-90-45棱镜对象(Prism 45-90-90在Zemax对象库里有预设),设置其尺寸为直角边长10mm。复制一块同样的棱镜,旋转180度后让两块棱镜的斜面紧密贴合,形成一个立方体。这两块的胶合面就是分光面。
第二步,在胶合面的面属性里添加镀膜。Zemax的镀膜编辑器可以自定义膜层,我一般建立一个理想化的“BEAMSPLITTER_50”膜层,设置反射率50%、透射率50%、吸收率0,用来做系统级的能量分析。实际量产时再换成多层介质膜的实测数据,概念完全一致。
第三步,布置光源。分光棱镜的典型使用场景是一束光进来,分成两束光出射。在入射面前方放置一个Source Ray,设置成网格或环形分布,模拟一束发散角很小的准直光。也可以用Source Diode模拟点光源加准直镜组的情况,看棱镜对发散光束的切趾效果。
第四步,在透射方向和反射方向各放一个Detector Rectangle,尺寸足够覆盖出射光斑,位置放在光路末端。然后设置光线追迹:追迹10万条光线,选中所有物体“物体”属性里的光线追迹区域,确保棱镜和探测器都参与追迹。
5.3 追迹结果解读:能量分比和杂散光
运行非序列追迹后,打开两个探测器的Detector Viewer,会看到两项关键数据:总能量和能量密度分布。
理想情况下,透射和反射方向应该各收到约50%的能量。但实际往往会有偏差,原因有几类:一是分光膜的R/T随入射角变化,边缘光线入射角大,分光比就和中心不一致;二是棱镜表面的剩余反射损失了一部分能量;三是光源设置不当,部分光线打到了棱镜的侧面或安装结构上,形成杂散光。
从探测器光斑图上,你会清楚看到圆形光斑在两个方向是否对称,有没有被棱镜边缘切掉,有没有额外的杂散光斑出现在附近。这就是非序列模式的最大价值——它能把你肉眼看不见的杂散光路径暴露出来。
如果后续要做更细致的相位分析,比如考察分光棱镜引入的波前误差对干涉系统的影响,可以在此基础上用POP物理光学传播接口继续做衍射传播分析,把探测器换成POP端口,看子光束的相位分布。这是另一个话题了,但非序列几何追迹是它的基础。
6. 公差分析:从“设计好看”到“车间做得出来”
6.1 一个没有公差分析的设计只是一张漂亮的图
不少新手在优化完成后就认为设计结束了,拿着MTF曲线到处展示。但光学设计的最终交付物不是曲线图,而是一套能按常规加工精度做出来、在批量性能统计上仍达标的镜头。车间师傅拿到图纸后,半径有加工误差,镜片厚度有偏差,装进镜筒还会偏心、倾斜,这些误差的累积效应如果没在设计阶段评估过,后果就是样机装出来像质不达标,只能从头返工。
公差分析的核心思路是:给每个制造环节分配一个加工误差范围,通过统计模拟评估系统性能在误差影响下的分布,再决定哪些公差要收紧、哪些可以放宽松。设计阶段留出足够余量,或者设计本身对公差不敏感,才能避免被工艺掐住脖子。
6.2 公差项与经验初值
Zemax的公差操作数覆盖了加工和装配的全套参数。以我常用的一组常规加工公差初值为例:
| 公差项 | 操作数 | 经验初值 |
|---|---|---|
| 曲率半径 | TFRN | 3~5个光圈(约0.5%~1%半径偏差) |
| 厚度/空气间隔 | TTHI | ±0.03~0.05mm |
| 表面偏心 | TEDX/TEDY | ±0.01~0.02mm |
| 表面倾斜 | TETX/TETY | ±0.5~1角分 |
| 折射率 | TIND | ±0.001 |
| 阿贝数 | TABV | ±0.5% |
这个表不是固定的,具体分配要结合车间实际能力和成本。同样的设计,给手机镜头的公差和给车载镜头的公差可以差一个数量级,因为量产工艺和单件价值完全不同。关键在于先建立一组合理的初值,再看哪些公差对性能影响最大。
6.3 补偿量、蒙特卡罗模拟与良率判断
公差分析不能只看单一公差项,还要考虑装配中实际存在的补偿量。最常见的就是后焦距补偿:装配时通过调焦环或间隔垫片微调最后一个镜片的位置,来抵消其他公差累积造成的离焦。Zemax公差分析里设置补偿器,就是在公差编辑器里增加一个补偿操作数,常用的是TTHI形式的“空气间隔补偿”,用“补偿器”对话框指定,模拟实际装配中的调焦流程。
设置完成后运行敏感性分析,可以看到每一项公差单独作用时对评价函数(通常是RMS光斑半径或MTF值)的贡献。贡献最大的那几项,就是加工时需要重点控制的项。
然后跑蒙特卡罗模拟,一般模拟200~500个随机样品,模拟结果会显示所有样品性能指标分布的直方图。看第90百分位或最差情况的RMS光斑是否还在允许范围内。如果最差10%超标,优先收紧要项的公差范围,而不是把所有公差都收紧——那样成本会成倍上升。如果蒙特卡罗结果普遍富裕,可以适当放宽部分公差,把成本让给加工端。
个人经验是,至少要留出15%~20%的性能余量给公差。设计阶段MTF超50%不算稳,跑到55%~60%再交出去,车间才敢接。
7. 流程走完回头看的五个常见坑
7.1 玻璃库不一致的“隐形错误”
用Zemax做设计时,玻璃数据来自玻璃库。不同版本的软件内置库可能略有差异,更常见的是德国肖特玻璃库、中国CDGM玻璃库混用。如果设计时用了CDGM库里的玻璃,后期导入到其他厂商的序列时查出不同牌号的阿贝数,系统色差平衡就全变了。我建议早期就锁定一家玻璃供应商,并把这个库交给客户确认,遇到玻璃停产替换时,要重新跑一遍色差和公差审核,不要只替换名称了事。
7.2 局部极值陷阱:别让优化器轻松骗过你
很多新手抱怨“怎么优化都长一个样”,大概率是被局部极值困住了。判断方法很简单:手动改一个半径或厚度,偏离当前解,再优化,看评价函数是否回到原来的值。如果回到的是更低的值,说明之前就在局部极值里。解决办法就是锤击优化,多换几个随机种子,观察评价函数的收敛分布。值得注意的是,全局优化跑出来的解不总是“能加工的”,有时候曲率半径和厚度的组合在数学上很优秀,但镜片弯到离谱,生产根本做不了。所以全局优化之后,一定要上一轮实际约束审查。
7.3 衍射与干涉仿真,别用几何光线硬解释
有人搜“zemax怎么仿真衍射干涉”,这个问题本身需要拆开。对常规成像系统,PSF和MTF曲线已经包含了衍射信息,衍射极限包络线就是孔径和波长的物理天花板,不需要额外“做衍射仿真”。但你要分析的是光束传播过程中的衍射演变,比如高斯光束通过小孔径后的近场衍射,那就不能用几何光线,必须用物理光学传播(POP),POP按采样网格传播复振幅,能直接给出衍射条纹和光强分布。至于干涉仿真,最实用的是分析菜单里的干涉图工具,输入Zernike系数或波前数据,就能生成参考波前和测试波前叠加后的干涉条纹。双光束干涉仪的完整建模也可以做,但不需要自己搭复杂的非序列模型,直接从OPD数据读波前误差更直接。
7.4 非序列模式中膜层“正反面”的坑
非序列模式中物体表面默认可以追迹所有方向的入射光,但膜层是有方向性的。给分光膜设置半反半透时,如果膜层附着在斜面的背面而不是正面,追迹结果可能是一路全透、一路全反,或者两路能量严重失衡。遇到这种诡异结果,先把膜层删掉重跑,看纯几何追迹是否正常;正常再逐面添加膜层,排查哪一面的法线方向反了。这个排查顺序能节省大量时间。
7.5 关于软件版本和可信来源
Zemax现在归属Ansys旗下,通行名称是Zemax OpticStudio,版本迭代频繁,菜单路径经常变化,比如新版本优化向导里的默认评价函数面板和老版本差别很大。如果网上搜到的教程和你的界面对不上,不要慌,核心逻辑都是同一套:波长—孔径—视场—结构—评价函数—优化—公差。另外一定要提醒一句,安装包请通过官方渠道申请试用授权或联系代理购买,不要用来路不明的第三方包,这类整合包里经常缺玻璃库模块,也可能夹带其他安全风险。工程文件和数据比软件本体值钱得多,这个账要算清楚。
光学设计流程说白了就是一套把物理需求翻译成数学函数、再用数值手段逼近的循环。我这几年最大的感受是,流程本身不神秘,难的是在每个环节都保持清醒:知道自己下一步要干嘛,知道为什么这么干。上面这些步骤和坑,都是反复试出来的,照着走一遍,你对Zemax的理解会完全不一样。这次的两个案例一个是序列折射式系统,一个是非序列分光系统,基本覆盖了日常设计的两种主战场。后续有没有必要再展开讲讲POP物理光学传播在激光系统里的实际应用?看大家反馈再定。