2、光线追迹基础:序列与非序列的底层逻辑
光线追迹,说白了就是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
- 启用“光线分裂”(非序列模式)
- 保存光线数据库(用于后处理)