Zemax混合模式实战:序列与非序列组件结合的光学设计指南
做光学设计的人多多少少都会碰到这种尴尬系统里大部分都是规规矩矩的球面透镜可偏偏在某个位置混进了一个棱镜、一块分光片或者一段导光管。用序列模式吧这些元件没法直接表达切成非序列模式吧像质评价又变得特别别扭优化起来找不到北。Zemax 里有个常常被初学者忽略的选项叫混合模式Mixed Mode它允许你在序列系统内部嵌入一个非序列组件让光线在组件内部用非序列方式追迹出了组件再回到序列模式继续传播。这篇博文就是给刚接触 Zemax 的人准备的我会把混合模式的前因后果、建模步骤、追迹规则、优化排错一次讲明白而且会拿实际项目里常见的分光棱镜、LD 准直整形这类场景当例子尽量让你看完能直接上手。1. 混合模式到底解决了什么问题——序列追迹与非序列物体的交界地带1.1 序列模式的“理想有序”世界先摆一个前提Zemax 的序列模式是很上头的。光线沿着表面 1、2、3、4 一路顺序追迹像流水线上的工件一样每过一个表面就发生一次折射、反射或者衍射最后落到像面上。这个模式速度快、结果稳定而且点列图、MTF、波前图这些像质评价工具它全都能给做镜头设计的人几乎每天都在用它。但序列模式的“天下太平”是建立在严格排序上的。光线永远按顺序走不回头、不分叉也不考虑同一束光在两个表面之间被劈成好几路。真实光路不是这样的。一块倾斜放置在光路里的玻璃平板表面一定会有反射光序列模式却只能当作一个普通折射面来处理想要模拟这块平板前后表面产生的鬼像或杂散光你得靠坐标断点去摆好几个虚拟表面又麻烦又脆。我在上学时第一次接触 Zemax加了个棱镜就发现光路怎么摆都别扭后来才明白序列模式是给“以透镜为主”的系统设计的它默认你把棱镜、分光片、反射镜这些都抽象成理想表面。抽象当然可以但抽象是有代价的——你失去了物理真实性。1.2 非序列组件不是光学元件而是一扇门混合模式里有一个关键概念叫“非序列组件表面”英文是 Non-Sequential Component缩写 NSC。初学者最容易误解的点就在这里以为它是一个棱镜或者分光片那样的光学元件。其实不是。它不是元件它是一扇门。你可以这样理解序列系统是一段固定的公路光线必须按车道、按信号灯一个路口一个路口开过去。NSC 表面则是公路上的一扇门光线到了这里暂时离开公路进入一片自由场地。在这片自由场地里光线不再有固定的“下一个路口”而是像一辆越野车一样根据地形物体几何自己判断要撞上什么、往哪个方向反弹、折射或吸收。等光线走到场地边界也就是这个组件的出口它又重新回到公路上继续按序列模式通过后面的透镜。这扇门打开以后你可以在里面的自由场地中摆放各种真实几何体直角棱镜、立方体分光棱镜、圆柱导光管、开孔挡板、镀膜反射面等等。光线怎么跟它们互动由几何和材质决定而不是由表面序号决定。这就是我理解混合模式的第一把钥匙混合模式不是一种特别的镜头类型而是一种“序列框架NSC局部空间”的组合策略。1.3 什么项目真正需要混合模式什么项目不需要根据我自己的经验下面这些场景用混合模式收益非常明显成像光路里插入了转向棱镜、直角棱镜或分光棱镜棱镜形状会影响光程和像质。光路中有机械挡光件、安装法兰、光阑开孔你想评估遮挡效应对像质和能量分布的影响。需要研究鬼像和内部多次反射的位置例如镜头和窗口之间来回反射形成的光斑。在镜头系统内嵌入导光照明组件或者半导体激光器LD准直整形后还要经过一系列透镜。光纤出射端与后续透镜组的对接光纤端面和纤芯特性用 NSC 物体建模更直接。反过来有些情况你就不该碰混合模式。如果整个系统本来就是照明配光比如 LED 路灯、背光板导光点阵那就直接用完整非序列模式没必要在序列框架里硬塞一个非序列区域。另一类是系统里没有成像评价需求、只关心单个表面上的能量分布这时候用混合模式反而会限制你的建模自由因为 NSC 组件表面本身会引入很多序列框架的约束。这个“什么时候不用”比“什么时候用”更重要初学阶段一定要先建立这种边界感。2. 从零搭建第一个混合模型让直角棱镜在序列光路里“营业”2.1 在镜头数据编辑器里插入 NSC 表面的标准动作建模操作并不难难在很多新手不知道在哪一步下手。打开镜头数据编辑器在你想插入非序列区域的那一行表面把它改成“非序列组件”类型。改完以后这一面就成了一个边界口。接下来打开非序列组件编辑器在里面添加具体物体。我先建议你做最简单的系统准直光束直接打向一个直角棱镜利用棱镜斜面的全内反射把光路折转 90 度然后在出口面后面再放一片会聚透镜把出射光聚焦到像面。具体设置可以这样在镜头数据编辑器里建立一个准直光源可以简单用一个足够远的点光源加准直透镜。在准直光路上插入一个 NSC 表面。打开 NSC 编辑器把物体 1 的类型选为棱镜类物体材料选 N-BK7尺寸按真实项目设定比如棱镜直角边 20 mm。把棱镜旋转到合适角度让光束在斜面上发生全内反射。N-BK7 对空气的临界角大约 41.8 度所以入射角要大于这个值。在 NSC 表面后面继续添加序列表面比如一片双凸透镜用于接收折转后的光束。这里我必须提醒一句不同版本里棱镜物体的名称有差异老版本可能叫 Rectangular Prism新版本可能叫 Prism 1、Prism 2带不带镀膜默认属性也不一样。你只要看到物体类型里有 Prism 或者 Rectangular Volume 这类选项基本就能用。2.2 NSC 编辑器里的关键参数设置把物体加进 NSC 编辑器只是第一步真正影响追迹结果的是下面这些参数参数作用我的建议物体类型决定几何形状比如长方体、圆柱、标准面、棱镜从棱镜或矩形体开始练手材料设定折射率、阿贝数、吸收系数可见光系统用 N-BK7 最稳妥位置与倾斜控制物体在 NSC 组内的空间姿态一定要搞清楚参考物体默认参考通常能省事拆分光线允许光线在界面处同时按反射和透射方向分裂做分光棱镜时必须开启散射光线是否生成散射光初期一律关掉免得光线数爆炸镀膜设置物体表面的反射率、透过率分光棱镜核心变量调试的时候不要把所有参数一次铺开。我习惯先把棱镜摆上去不开拆分、不开散射只看主光线能不能顺利走通。这一步走通了再加镀膜和拆分。2.3 用 3D 查看器和光线族判断建模是否成功模型建完后点一下布局图更新如果设置正确你会在 3D 视图里看到光线先以序列方式到达 NSC 表面然后在棱镜里发生全内反射再从出口离开回到序列光路里继续传播。这里有个经验布局图看着通不代表追迹数据一定对所以我还会用光线族分析或者直接在像面上看光斑分布。第一次做混合模式的人十有八九会在 3D 视图里看到光线进入 NSC 组件后凭空消失。这种情况通常不是你摆放角度错了而是光线方向没有进入棱镜的入口或者被物体边缘吞掉了。把视角转一圈配合“忽略错误”选项看错误日志能更快定位。不过“忽略错误”只能是调试手段正式计算前一定要关掉它否则你会被表面正常的光线分布骗过去。3. 追迹规则比点按钮更值得背下来出入口、能量分裂与数据判读3.1 光线入口和出口的机制以及“留余量”的实战含义这里想多聊一点背后机制因为很多教程只教你怎么点按钮不教你怎么理解系统行为。NSC 表面在序列系统里处于某个“物理位置”光线从上一个序列表面出发到这个位置进入非序列区域。这个区域并不是无限大的它有自己的边界。当光线在区域内被物体反射、折射到某个方向如果该方向最终到达了出口边界它就被系统判定为“可以离开”然后转换为序列光线继续追迹。如果光线在区域里反复被物体挡住转了好几圈都到不了边界那它就会一直追下去直到被能量阈值截断。我在实际项目里栽过一跟头把一个棱镜放得离 NSC 出口面太近折转后的光路被出口面切掉了大半像面上光斑少了一个角怎么查都查不出问题。后来把 NSC 表面前后各留出一点过渡空间问题立刻消失。所以我强烈建议在 NSC 表面两侧至少留 2~3 毫米的给反射光、散射光“喘气”的余量。不要只盯着主光线方向看还要想象所有可能折转到侧面或后方的光路。这个机制也解释了为什么混合模式的速度比纯序列模式慢。序列模式每次追迹都是固定流程非序列区域里却要做真正的几何求交。好在混合模式只让光线在局部区域使用非序列追迹其余部分仍然是序列追迹所以性能损失还可以接受。3.2 要不要开启 Split/Scatter默认设置会骗人很多初学者会觉得NSC 组里的光线一定会自然产生反射和透射。但 Zemax 的默认设置往往只在主要能量方向上追迹。什么意思呢就是一条光线打到折射界面系统默认只追迹那个能量相对最高的透射光反射光也会生成但不是以独立分支的形式参与后续计算。你最后看到的光斑分布看起来是正常的可你得不到能量劈分信息。如果要做分光棱镜或者分析鬼像你必须在物体属性里把“拆分光线”打开。打开之后一条光线在分光面上会分裂成两路甚至更多路每一路都携带自己的能量权重。这是最接近物理真实的做法也是混合模式比序列近似强大的地方。另外还有一个实用参数叫“最小相对能量”。光线的能量在多次分裂后会越来越小这些微弱光线对结果影响很小却要消耗大量计算时间。我一般设到 1e-4 或 1e-5低于这个阈值的分支就不再追迹。这个习惯在优化阶段特别管用能省下不少时间。3.3 在 NSC 组内放置探测器而不截断光路混合模式中常会遇到一个需求在组件内部某处测量能量分布但又希望光线继续传播到后面的序列镜头。比如检测分光棱镜分离出来的一小部分光同时又不想让它挡住主光路。有些初学者会把一个普通的矩形探测器塞进去结果光束被探测器吸掉了后面像面全黑。解决办法是把探测器设为“透射型探测器”也就是它虽然不是物理存在的表面但仍然记录经过它的光线的能量。这样它既能把能量分布数据保存下来又不干扰后续追迹。后面的优化阶段如果你想用评价函数去控制探测器上的能量读数就用 NSDD 这类指令去提取探测器数据不一定要依赖常规像面数据。这个过程听起来略绕但实际用过一两次就会习惯。先放探测器读数据再关掉它或把它设为透射型完全取决于你这一步是要功能分析还是要最终成像。4. 优化和排错我在这上面花掉的时间比建模型多三倍4.1 ZPL 宏常见报错“Unknown symbol getthickness”的完整排查链路网上关于 Zemax 的搜索词里有个很典型的报错“zemax宏unknown symbol getthickness”。这个坑我也踩过而且当时花了一个晚上才搞定。情境是这样的你在镜头数据编辑器里加了好些表面想写个 ZPL 宏去检查某个面的厚度于是随手敲了一行thick getthickness(3)结果宏一跑报出“Unknown symbol getthickness”。看名字好像只是拼写问题但排查起来要几步首先Zemax 的宏语言是区分大小写的函数名必须和内置函数库完全一致正确写法是GETTHICKNESS(3, 0)。其中 3 是表面编号0 是返回代码0 通常代表该表面的厚度值。你写成全小写解析器就不认。其次如果函数名没问题但依然报错那就要检查是不是表面编号输入有问题。比如系统里根本没有第 3 个表面函数可能返回 0但不一定会明确报错。这时候建议先在宏里加一行打印PRINT surface 3 thickness , GETTHICKNESS(3, 0)把这行跑通再往下写比你一次写几十行再调试快得多。最重要的一点也是和混合模式最相关的一点GETTHICKNESS读的是序列模式镜头数据编辑器里的厚度不是 NSC 组件里某个物体的厚度。在混合模式下你如果想去读棱镜或者分光板的尺寸用GETTHICKNESS根本读不到必须换用 NSC 物体数据查询函数比如NSTR或者NSCD配合物体编号和参数编号去取。如果你在宏里混用看着像是在读物体厚度实际上它可能返回的是表面厚度或干脆返回 0这就是最隐蔽的坑。4.2 混合模式下的评价函数构建思路混合模式系统的优化和纯序列系统有个很大的不同默认的优化评价函数主要服务于序列光线。什么意思呢就是它计算误差时默认认为光线会按照表面顺序到达像面然后把所有光线落到像面的位置和理想位置之间的偏差统计出来。可混合模式里一部分光线在 NSC 内被分了叉有些能量跑到别的方向有些产生了多次反射。这时如果评价函数还盯着单一像面算 RMS 半径很容易失真。我有一次优化一个分光棱镜加后面会聚透镜的系统每次优化都说系统已经收敛了但实际上分光后两路的相对能量比例完全不对。原因就是我用的评价函数只看主光路像点根本没把分光后的能量分布算进去。正确思路是把评价函数的目标拆成多个子目标。一是孔径和焦距这类基本参数继续用默认评价函数控制二是分光能量比这样的指标用探测器数据来控制。做法是先放一个透射型探测器然后建一个 ZPL 宏评价函数在里面用NSDD读取探测器能量再把实际能量比和目标之间的偏差作为函数值。这样优化器才会真正去调整分光膜的反射率或棱镜的倾斜角而不是傻乎乎地只追求光斑最小。权重分配上也有讲究。我的经验是先把归一化能量比设为主要目标权重给到 1像质目标先不要给太高权重。等你看到能量比稳定了再逐渐增加像质权重。因为这两个目标之间经常存在冲突一开始就让它们打架优化器很容易在中间地带反复振荡。4.3 追迹通过但优化发散时的“降维验证”方案混合模式优化中最劝退的现象是布局图里光线走得很好光斑也能出来可一跑优化系统就像发了疯光学结构的参数乱跳最后评价函数差到离谱。原因通常不在优化算法而在于混合模式里某些参数对评价函数的影响极度非线性。比如棱镜的倾斜角稍微变一点分光光路就可能完全偏离后续望远镜或透镜组像面光斑瞬间消失。优化器遇到评价函数变成极大值甚至无定义的情况自然会乱试。这时候我会用“降维验证”手段先把 NSC 组件临时替换成一块等效厚度的平行平板用纯序列模式把系统跑顺确认后组透镜的初始结构没问题。再把平行平板换回真正的棱镜或分光片保持后组结构不变只优化 NSC 相关的几个参数。这种方法看起来土但非常有效。它可以把“系统参数问题”和“混合组件建模问题”分开来定位而不是混成一锅粥。如果你的模型里 NSC 物体很多还可以进一步缩小范围只保留一个关键物体其他都暂时设为完全透射或者移除逐级验证。不要指望一次把所有物体和变量同时打开就能顺利收敛。混合模式不是魔法它只是让复杂光路变得可建模优化仍然遵循从简到繁的工程逻辑。5. 从“跑通”到“能用”扩展多项式、分光棱镜与性能取舍5.1 扩展多项式在混合模式里的正确打开方式扩展多项式这个词在光学设计里经常和自由曲面绑定。简单说它是一种表面面形描述方式用多项式系数去生成非球面或者自由曲面。混合模式里NSC 物体的某些表面也可以赋予扩展多项式面形。这意味着你可以在非序列组件内部放一个自由曲面棱镜或者一片非球面分光板。我建议初学者不要一上来就在混合模式里用高阶扩展多项式。正确步骤是先在序列模式里用一个等效假面做初步优化确定面形的大致系数范围再把相关系数搬到 NSC 物体上做微调。如果直接在 NSC 物体上同时放开十个多项式系数优化器很容易陷入局部极小而且局部极小点往往对应着非常离谱的面形。用扩展多项式优化时还有一条经验先只放开低阶项比如二阶、四阶项把基本像差校正好等系统进入了比较稳定的区域再放开高阶项用来精修。这个“从低到高”的顺序能有效防止高阶系数“吸”掉误差把面形搞成过山车。5.2 一个典型分光棱镜混合模型的参数清单与结果判读说了这么多最终还是要落回具体案例。下面是我在一个实际分光棱镜项目中比较常用的参数配置你可以作为起点设置项我的常用值理由棱镜材料N-BK7折射率稳定加工成熟成本友好分光镀膜50% 反射 / 50% 透射是分光棱镜最直观的验证目标最小相对能量1e-4截断微弱光线平衡精度和速度最大分裂次数限制在 3~5 次防止光线分裂指数增长探测器类型透射型矩形探测器记录能量但不截断后续序列光路NSC 表面前后过渡厚度至少 2~3 mm给反射光、散射光留物理空间结果判读时要看两样东西平面图和探测器能量值。平面图里你能直观看到透过支和反射支清清楚楚分开路径和预期一致探测器能量值则告诉你实际能量比是不是接近 50:50。如果不是先检查镀膜属性有没有正确施加到棱镜胶合面上再检查拆分光线有没有打开。这两点出错的概率非常高。有一个细节我曾经忽略棱镜内部胶合面如果要镀分光膜必须选中正确的物体面编号。NSC 物体是有多个面的如果你不小心把膜层设在入射空气面上光线还没进入棱镜就发生了反射结果当然不对。解决方法是先给每个物体分配不同的面编号再逐面确认材质和膜层。5.3 性能取舍什么该用 NSC什么不该用它最后一个问题混合模式这么好用是不是所有系统都应该建这么一套我的答案是否定的。混合模式的代价是计算效率。同一个系统里只要有一小段光路使用非序列追迹整体的追迹速度就会明显下降。如果 NSC 区域内物体数量多、拆分光线多、最小能量阈值设得很低一次光线追迹的时间可能比纯序列模式高出几十倍。实际项目中我通常分两轮工作。第一轮优化用纯序列近似把所有透镜参数跑得差不多这时候系统结构基本确定了。第二轮再引入 NSC 组件验证棱镜、分光、鬼像、杂散光等序列近似处理不了的问题。第一轮追求的是速度第二轮追求的是真实。混合模式应该放在真实度需要被验证的时候而不是整个设计过程中从头到尾都开着。还有一个速度技巧如果 NSC 组件里某些物体对主光路影响很小只是作为挡光杂散件存在你可以把它们暂时设为“不参与追迹”或降低其面数复杂度先让主光路优化通过最后在验证阶段再全部打开。整个过程像雕刻先砍大形再做细节。到现在我还是习惯在建任何含棱镜或分光元件的光学系统时先问自己一句哪些光路是稳定主轴必须用序列结构固定下来哪些位置会发生分束和杂散必须用 NSC 去暴露问题。这样分好了混合模式才真正成为设计工具而不是一个能跑通但谁也改不了的玩具。