2. Zemax基础操作

光线追迹,说白了就是Zemax的“发动机”。你设计再好的镜头,最终都要靠它来算出像质。我刚开始学Zemax时,总觉得这步是软件自动完成的,没必要深究。直到有一次,一个看似简单的投影系统,怎么优化都达不到指标,最后发现是追迹模式选错了……嗯,从那以后,我每次建新文件都会先确认:这次该用序列还是非序列?

2.1 序列光线追迹:一条路走到黑

序列追迹,顾名思义,光线按你定义的表面顺序,一个接一个地传播。从物面出发,经过第1面、第2面……直到像面。每条光线只有一个“命运”——沿着预设的路径走到底。

核心特征:光线与表面只相交一次,且严格按照面序号顺序传播。没有分支,没有反射(除非你特意设置Mirror),没有鬼像。

我在做手机镜头设计时,90%的工作都在序列模式下完成。为什么?因为快。序列追迹的计算量小,适合快速评估像差、优化结构。

特性 序列模式 我的经验
光线路径 固定顺序,1→2→3…→像面 适合折射式、共轴系统
计算速度 快(毫秒级) 优化迭代时首选
支持面型 标准面、非球面、衍射面等 几乎覆盖所有常规光学面
典型应用 镜头设计、像差分析、MTF计算 我90%的序列工作流

小技巧:在序列模式下,如果你需要分析某个面的局部光线行为,可以用“Single Ray Trace”工具。我经常用它来检查边缘光线的入射角,判断是否接近全反射临界值。

2.2 非序列光线追迹:光线的“自由搏击”

非序列追迹就完全不一样了。光线不再按固定顺序传播,而是根据物理规则“自由飞行”。它会与场景中的任何物体相交——反射、折射、散射、吸收,甚至分裂成多束。每条光线都有自己的“故事”。

为什么会需要这种模式?你想想看,一个棱镜系统,光线可能在内部多次反射;一个LED照明系统,光线会被透镜、反射杯、扩散片反复折腾。序列模式根本处理不了这种复杂路径。

注意:非序列追迹的计算量远大于序列模式。我曾经模拟一个包含100万个光线的LED路灯系统,单次追迹跑了将近20分钟。所以,能用序列解决的问题,尽量不要用非序列。

特性 非序列模式 我的经验
光线路径 自由传播,由物理决定 适合照明、杂散光分析
计算速度 慢(秒到分钟级) 只在必要时使用
支持物体 光源、探测器、任意形状物体 可以模拟真实物理场景
典型应用 照明设计、鬼像分析、激光系统 我用来验证序列设计的可靠性

2.3 光线数据库与追迹控制

Zemax里有一个容易被忽视但极其重要的工具——光线数据库。它记录了每条光线的完整追迹信息:位置、方向、光程、能量、偏振态等。

我个人习惯在分析复杂系统时,先跑一个“光线数据库”,然后导出数据做后处理。比如,我曾经用Python读取光线数据库,分析某个镜头的畸变分布,比Zemax自带的网格图更灵活。

光线数据库的核心字段:

  • X/Y/Z坐标:光线在某个面上的交点位置
  • L/M/N方向余弦:光线的传播方向
  • 光程(OPL):从光源到当前点的光学路径长度
  • 强度:光线的相对能量(非序列模式)
  • 波长:光线对应的波长编号

追迹控制参数直接影响结果的精度和速度。我见过不少新手直接使用默认设置,结果在分析衍射极限系统时,追迹精度不够,导致MTF曲线出现异常抖动。

控制参数 默认值 我的建议
光线数量 3(近轴) 分析像差时至少用6条
追迹精度 0.01 高精度分析设为0.001
最大迭代次数 100 非序列复杂场景可增至500
偏振追迹 关闭 涉及镀膜或双折射时开启

避坑指南:我曾经在分析一个激光扩束系统时,发现光线追迹结果与理论值偏差很大。排查了半天,最后发现是“最大迭代次数”设得太低,导致非球面光线追迹未收敛。从那以后,我只要涉及非球面,都会把迭代次数提高到200以上。

2.4 序列 vs 非序列:如何选择?

这个问题我几乎每次培训都会被问到。我的回答很简单:能用序列,就用序列。序列模式快、稳定、易于优化。只有当序列无法描述系统行为时,才考虑非序列。

下面这张图是我自己总结的选择逻辑,你可以参考:

光线追迹模式选择逻辑 开始设计 系统是否存在非顺序光路? 否 序列模式 快速优化、像差分析 是 非序列模式 照明、杂散光分析 验证与迭代 提示:混合模式(序列+非序列)可用于复杂系统,如先序列优化镜头,再非序列分析杂散光

2.5 实战:追迹控制参数设置

最后,我分享一个实际案例。去年我做了一个车载镜头项目,要求全视场MTF在50lp/mm处大于0.3。初始结构跑出来MTF只有0.15,怎么优化都上不去。

后来我发现,问题出在追迹设置上。默认的“3条光线”只追迹了主光线和两个边缘光线,根本无法准确描述非球面带来的高阶像差。我把光线数量改为“8条”(0.0、0.3、0.5、0.7、0.85、1.0视场,每个视场3个孔径),追迹精度从0.01改为0.001,重新优化后MTF直接跳到了0.35。

我的标准追迹设置(高精度分析):

  • 光线数量:视场数 × 3(至少)
  • 追迹精度:0.001
  • 最大迭代次数:200
  • 启用“光线分裂”(非序列模式)
  • 保存光线数据库(用于后处理)