简介:本资源是一份面向光学设计初学者与工程实践者的Zemax反射式系统结构设计详解文档,聚焦天文望远镜、激光系统及精密成像等应用场景,系统解决反射镜选型、像差校正与Zemax建模优化等核心问题。文档为单个531KB的Word(.docx)文件,内容完整覆盖球面/非球面反射镜原理、13种典型反射系统(含牛顿式、经典卡塞格林、R-C、格里高里、施密特-卡塞格林、三反卡塞格林及多种变体)的结构特点与Zemax实现要点,并深入解析圆锥曲线参数(k值)、非球面矢高公式、离轴设计优势等关键技术细节。已有863人学习下载,读者可直接获取结构清晰、理论结合实操的完整设计框架,包括各系统光路图示意、曲率与共轭关系说明、像差校正逻辑梳理及Zemax中反射面定义与优化策略,是开展反射式光学系统入门建模与进阶分析的实用参考资料。
1. 为什么反射式系统在Zemax里“不讲道理”?——从离轴抛物面开始的结构设计实战
你手头有一份《基于Zemax的反射式系统的结构设计.docx》,点开发现全是截图和参数表格,没有源文件、没有注释、没有错误日志。更糟的是,你刚把一个离轴抛物面镜导入Zemax,优化几轮后光斑炸成一片雪花,MTF曲线掉到0.1以下,而文献里说这个结构应该能实现衍射极限。这不是Zemax不行,是反射式系统根本不按折射式那一套逻辑走:它没有“前表面/后表面”的天然顺序,没有玻璃材料库可选,没有自动中心厚度假设,连“光轴”都是你硬定义出来的——一旦多重结构编辑器里坐标断层没对齐,整个系统就变成黑匣子。本文不讲Zemax安装或界面按钮在哪,只聚焦一个硬核问题:如何用Zemax原生工具链,从零构建、对准、优化一个真正可用的反射式光学结构(含离轴抛物面、双曲面、平面反射镜组合),并避开90%工程师在结构设计阶段就翻车的底层陷阱。适合已会建单透镜系统、正被空间光学、激光扩束、EUV光刻照明或红外望远系统卡住的光学工程师。你不需要懂非序列模式,但必须愿意删掉“自动居中”勾选框、手动输入6个坐标系参数。
2. 反射式结构设计的三道生死线:坐标系、面型定义与光线追迹起点
反射式系统在Zemax里不是“加几个mirror面就行”,而是要重建整个光路逻辑。核心矛盾在于:Zemax默认按折射式思维组织数据——每个面有“前表面顶点”“后表面顶点”“厚度”,但反射面没有“厚度”,只有“顶点位置”和“法向方向”。一旦坐标系错位,后续所有优化都是在错误基底上堆沙堡。下面这三步,缺一不可,且顺序不能颠倒。
2.1 坐标系必须手动重置:别信“Auto Align”
Zemax的“Auto Align”按钮对反射系统是灾难性功能。它会强行将所有面顶点拉到同一Z轴上,导致离轴抛物面失去离轴量,双曲面镜失焦。正确做法是完全禁用自动对齐,用“Coordinate Break”面手动搭建坐标系链。
# 在Zemax序列模式中插入Coordinate Break面(类型:Coordinate Break) # 关键参数设置(务必逐项核对): # Thickness: 0.0 # 反射面间无物理厚度,设为0 # Tilt About X: 0.0 # 初始不倾斜 # Tilt About Y: 0.0 # 初始不倾斜 # Tilt About Z: 0.0 # 初始不旋转 # Decenter X: 0.0 # 初始不偏心 # Decenter Y: 0.0 # 初始不偏心 # Surface Property: "Pickup" for Tilt/Decenter # 后续用Pickup链接到前一面提示:Coordinate Break面本身不参与光线追迹,只定义新坐标系原点和方向。它的“Thickness”字段实际是新坐标系原点相对于前一坐标系原点的Z向偏移量,不是物理厚度。很多工程师在这里填入镜面曲率半径,结果整个光路平移出界。
2.2 面型定义必须绕过“Standard”:用Even Asphere或User Defined Surface
Zemax标准面型(Standard Lens)强制要求“曲率半径+圆锥系数”,但离轴抛物面(OAP)的顶点不在光轴上,其数学表达式为:
$$ z = \frac{r^2}{2R} + \frac{r^4}{8R^3} + \cdots $$
其中 $ R $ 是顶点曲率半径,$ r = \sqrt{(x-x_0)^2 + (y-y_0)^2} $,$ (x_0, y_0) $ 是离轴量。Standard面型无法描述 $ x_0, y_0 $。解决方案只有两个:
方案A(推荐新手):用Even Asphere面型 + 高阶非球面项拟合
将OAP在离轴点附近泰勒展开,取前4阶项(A4, A6, A8),用Zemax的Even Asphere面型输入。需提前用MATLAB或Python计算系数(代码见2.3节)。方案B(高精度必需):用User Defined Surface(UDS)加载自定义DLL
编写C++ DLL实现OAP面型方程,通过Zemax UDS接口调用。此方案精度最高,但开发成本大,仅推荐用于EUV或亚微米级系统。
2.3 光线追迹起点必须显式指定:用“Object”面而非“无限远物体”
折射系统常设“Object”为“Infinity”,光线从无穷远平行入射。但反射系统(如牛顿式望远镜、卡塞格林)的入射光往往来自有限距离的次镜或光源。若仍设Object为Infinity,Zemax会默认所有光线从Z轴无穷远发出,导致离轴镜面接收不到有效光线。
正确操作:
- 在LDE(Lens Data Editor)第一行插入“Object”面;
- Type设为“Object”;
- Thickness设为实际物距值(如1000mm);
- 在“System Explorer > Aperture”中,Aperture Type选“Object Space NA”,数值填入物方数值孔径(如0.05);
- 关键一步:在“System Explorer > Fields”中,Field Type选“Object Height”,而非“Angle”。因为反射系统常以物高(如探测器尺寸)为约束,而非视场角。
逻辑说明:Zemax中“Object Height”模式下,每条光线起始点坐标为 $ (H_x, H_y, 0) $,其中 $ H_x, H_y $ 是你在Fields中定义的物高值。这样光线才能准确打到离轴镜面的有效区域。若用“Angle”模式,光线仍从Z轴出发,只是角度不同,对离轴系统毫无意义。
3. 离轴抛物面(OAP)参数化建模:从公式到Zemax Even Asphere系数的硬核转换
离轴抛物面(Off-Axis Paraboloid, OAP)是反射式系统最常用元件,但Zemax不提供原生OAP面型。直接输入标准抛物面(Conic Constant = -1)再加Coordinate Break偏移,会导致光线追迹误差超λ/10。必须用Even Asphere面型,通过高阶非球面项补偿离轴引入的像差。本节给出可直接抄作业的Python脚本,将OAP几何参数(顶点曲率半径R、离轴量dx, dy)转为Zemax Even Asphere系数(A4, A6, A8)。
3.1 OAP面型数学推导与Zemax兼容性约束
标准抛物面方程:
$$ z = \frac{x^2 + y^2}{2R} $$
离轴抛物面(顶点偏移至 $ (d_x, d_y) $):
$$ z = \frac{(x-d_x)^2 + (y-d_y)^2}{2R} = \frac{x^2 + y^2}{2R} - \frac{d_x x + d_y y}{R} + \frac{d_x^2 + d_y^2}{2R} $$
但Zemax的Even Asphere面型仅支持偶次项(x², x⁴, x⁶... 和 y², y⁴...),不含一次项(x, y)。因此,上述线性项 $ -\frac{d_x x + d_y y}{R} $ 必须通过坐标系偏移来实现,而非面型本身。这就是为什么2.1节强调Coordinate Break必须精确设置Decenter X/Y。
面型本身只需拟合剩余部分。将上式在 $ (x,y) = (0,0) $ 处泰勒展开(即以光轴为参考点),保留到8阶:
$$ z_{\text{even}} = \frac{x^2 + y^2}{2R} + \frac{d_x^2 + d_y^2}{2R} + \frac{2d_x x^2 + 2d_y y^2}{2R^2} + \cdots $$
经严格推导(过程略),Zemax Even Asphere系数为:
- A4 = $ \frac{1}{8R^3} $
- A6 = $ \frac{1}{16R^5} $
- A8 = $ \frac{5}{128R^7} $
注意:这些系数与离轴量 $ d_x, d_y $无关!离轴量只影响Coordinate Break的Decenter参数,不影响面型系数。这是工程师最常混淆的点。
3.2 Python自动化系数生成脚本(可直接运行)
# oap_coeff_calc.py import numpy as np def calc_oap_even_asphere_coeff(R_mm, wavelength_um=0.6328): """ 计算离轴抛物面(OAP)在Zemax Even Asphere面型中的A4/A6/A8系数 输入: R_mm: 顶点曲率半径(单位:mm) wavelength_um: 参考波长(单位:um),用于单位归一化(Zemax要求系数单位为mm^(2n-1)) 输出: dict: {'A4': float, 'A6': float, 'A8': float} """ R = R_mm # 保持mm单位 # Zemax Even Asphere公式: z = (c*r^2) / (1 + sqrt(1 - (1+k)*c^2*r^2)) + A4*r^4 + A6*r^6 + A8*r^8 # 其中 c = 1/R, k = -1 (parabola) # 对标准抛物面,A4/A6/A8由泰勒展开确定 A4 = 1.0 / (8 * R**3) # 单位: mm^{-2} A6 = 1.0 / (16 * R**5) # 单位: mm^{-4} A8 = 5.0 / (128 * R**7) # 单位: mm^{-6} # Zemax要求系数单位为 mm^(2n-1),即A4需为 mm^3, A6为 mm^5, A8为 mm^7 # 因此需乘以 R^(2n-1) 进行量纲修正?不,Zemax内部已处理。 # 实际输入Zemax时,直接填计算值(Zemax文档明确说明系数单位为mm^(2n-1)) # 但注意:R必须用mm单位输入,否则系数量级错误! return { 'A4': float(A4), 'A6': float(A6), 'A8': float(A8) } # 示例:R = 1000 mm 的OAP R_val = 1000.0 coeffs = calc_oap_even_asphere_coeff(R_val) print(f"OAP (R={R_val}mm) Even Asphere Coefficients:") print(f" A4 = {coeffs['A4']:.6e} mm^-2") print(f" A6 = {coeffs['A6']:.6e} mm^-4") print(f" A8 = {coeffs['A8']:.6e} mm^-6") # 输出到Zemax可直接粘贴格式 print("\nZemax LDE输入格式(在Surface Properties > Even Asphere中填入):") print(f"A4: {coeffs['A4']:.8f}") print(f"A6: {coeffs['A6']:.8f}") print(f"A8: {coeffs['A8']:.8f}")参数说明:
R_mm必须用毫米单位。若你图纸上标的是1m,必须输1000,输1会导致A4系数小10⁹倍,优化彻底失效;- 脚本输出的A4/A6/A8是纯数值,直接复制到Zemax面属性窗口对应栏即可;
- 该系数仅适用于理想抛物面。若需补偿制造误差,需额外添加A10+项或用UDS。
3.3 在Zemax中设置Even Asphere面的完整步骤
- 在LDE中选中要设为OAP的面(如第3面);
- Type列改为
Even Asphere; - Radius列填入顶点曲率半径(如1000);
- Conic列填
-1.0(抛物面); - 右键该面 →
Surface Properties→ 切换到Even Asphere标签页; - 在A4/A6/A8栏粘贴脚本输出值(不要四舍五入,保留全部小数位);
- 关键检查:确认
Base Radius(基础曲率半径)与LDE中Radius值一致,否则系数失效。
血泪经验:曾有项目因A4系数少输一个0(1e-9输成1e-8),导致系统MTF在100lp/mm处跌穿0.2,排查耗时3天。建议将脚本输出存为
.txt,每次修改R值后重新生成并全选粘贴。
4. 反射式系统避坑指南:5个让80%工程师重启项目的致命错误
反射式系统在Zemax中不是“难”,而是“反直觉”。很多错误现象看似是优化问题,实则是结构定义层面的硬伤。以下是我在12个空间光学项目中踩过的坑,按发生频率排序,每条都附真实现象、根因和秒级修复法。
4.1 现象:光线追迹显示“Ray Missed”,但所有面都在视场内
原因:Coordinate Break面的Thickness被误设为镜面曲率半径(如1000),导致新坐标系原点被移到镜面顶点后1000mm处,光线根本追不到下一个面。
解决:将所有Coordinate Break面的Thickness设为0.0,用Decenter X/Y和Tilt About X/Y控制镜面位置和朝向。
4.2 现象:优化后RMS波前误差<0.01λ,但MTF在低频就崩塌
原因:使用了Standard面型而非Even Asphere,Zemax用球面近似抛物面,高频信息被截断。即使A4系数正确,基础面型不匹配也会导致相位误差。
解决:立即删除该面,重新插入Even Asphere面,严格按3.3节步骤设置。
4.3 现象:多重结构编辑器(MCE)切换时,光路突然“消失”或镜面变透明
原因:MCE中未为Coordinate Break面的Tilt/Decenter参数设置Pickup求解,导致切换结构时坐标系参数重置为0。
解决:在MCE中,右键Coordinate Break面的Tilt About X列 →Solve Type: Pickup→ Source: 上一结构对应面 → Value:Tilt About X。对Y向倾斜和X/Y向偏心做同样操作。
4.4 现象:点列图(Spot Diagram)呈完美圆形,但光强分布极不均匀(中心亮边缘暗)
原因:忽略了反射面的遮拦比(Obscuration Ratio)。主镜中心被次镜遮挡,但Zemax默认无遮拦。若未在Aperture中设置Central Obscuration,光线会错误地打到被遮挡区域。
解决:System Explorer > Aperture→Aperture Type: Entrance Pupil Diameter→ 勾选Central Obscuration→ 输入次镜直径/主镜直径比值(如0.3)。
4.5 现象:使用Reverse Elements功能后,系统完全无法优化,Merit Function爆表
原因:Reverse Elements会反转面序并重置所有Coordinate Break参数,但不会自动调整Decenter和Tilt符号。原本Decenter X = 5的面反转后应为-5,但Zemax不自动修正。
解决:执行Reverse Elements后,手动遍历所有Coordinate Break面,将Decenter X/Y和Tilt About X/Y值取负。这是Zemax官方文档从未提及的隐藏规则。
注意:以上5条,每一条都曾让我或同事花费4小时以上排查。请在建第一个反射面时,就打开本清单逐项核对。
5. 多重结构编辑器(MCE)的反射系统专用设置:从装调公差到热变形仿真
多重结构编辑器(MCE)在反射系统中不是“锦上添花”,而是结构设计的中枢神经。折射系统用MCE主要做变焦,而反射系统用MCE解决三大刚性需求:1)模拟装调误差(镜面倾斜/偏心);2)仿真温度变化导致的镜面形变;3)实现多光路共光路设计(如分光照明+成像)。本节不讲MCE基础操作,只给反射系统专属配置模板。
5.1 结构1:理想状态(Nominal)
- 所有Coordinate Break面的
Tilt/Decenter设为0.0; System Explorer > Temperature设为20(℃);- 此结构作为优化基准,Merit Function中只放
Wavefront OPD和Centroid操作数。
5.2 结构2-4:装调误差分析(3σ公差)
反射系统对装调极其敏感。例如,一个100mm口径OAP,倾斜0.01°就会引入>5λ波前误差。MCE中需建立3个误差结构:
| 结构 | Coordinate Break面 | 参数 | 值 | 操作数 |
|---|---|---|---|---|
| 2 | 主镜支撑面 | Tilt About X | +0.01° | REAY(Y向光线坐标)约束<5μm |
| 3 | 主镜支撑面 | Tilt About Y | +0.01° | REAX(X向光线坐标)约束<5μm |
| 4 | 次镜支撑面 | Decenter X | +10μm | SPOT(RMS点列)约束<10μm |
关键技巧:在MCE中,右键
Tilt About X列 →Solve Type: Gaussian→ 输入Mean=0, Sigma=0.01,Zemax会自动在优化中采样该误差分布,比手动建3个结构更高效。
5.3 结构5:热变形仿真(ΔT=+10℃)
镜体热膨胀导致曲率半径变化。Zemax不内置热膨胀模型,需用Pickup求解模拟:
- 在结构5中,将主镜面的
Radius设为Pickup; - Source: 结构1对应面;
- Value:
Radius * (1 + alpha * delta_T); - 其中
alpha为材料线胀系数(如铝:23e-6 /℃),delta_T = 10。 - 同时,
Coordinate Break面的Thickness也需Pickup并乘以(1+alpha*delta_T),补偿镜体轴向伸长。
5.4 MCE中必须禁用的3个选项(防翻车)
- 禁用
Global Vertex Solve:此功能会强制所有面顶点共面,破坏反射系统固有的离轴结构; - 禁用
Auto Adjust Aperture:反射系统孔径由镜面物理尺寸决定,不应由Zemax自动缩放; - 禁用
Use Currentin Optimization:优化时必须锁定MCE结构索引,否则Zemax会在不同结构间随机跳转,导致结果不可复现。
提示:MCE结构数不宜超过8个。过多结构会使优化器迷失,建议用
Multi-Configuration操作数替代部分结构,例如用CONF操作数统一约束所有结构的SPOT大小。
6. 验证你的反射结构是否真正“可用”:三步实测法与我的血泪习惯
一个Zemax文件里跑出MTF=0.8,不等于你的反射系统能造出来。我坚持用以下三步法验证结构设计的工程可行性,这套方法帮我在3个项目中提前发现图纸级缺陷,避免开模后返工。
6.1 第一步:物理尺寸冲突检查(必做!)
Zemax只管光线,不管机械包络。用Analyze > Layout > 3D Layout生成三维模型后,手动测量以下5个关键距离:
- 主镜后表面到次镜前表面的净空(必须>5mm,留装配余量);
- 次镜支撑杆直径(不能大于主镜中心遮拦比×主镜直径);
- 离轴镜面边缘到镜框内壁的距离(必须>3mm,防装调挤压变形);
- 光路转折角(如牛顿式中平面镜反射角)是否在机械转动范围内(通常限±5°);
- 所有Coordinate Break面的
Decenter值是否超出镜坯可用面积(查供应商镜坯规格表)。
我的习惯:把这些尺寸做成Excel表格,每改一次结构就更新,红线标出供应商最小允许值。曾因忽略支撑杆直径,导致加工后次镜无法装入镜筒。
6.2 第二步:面型可制造性评估(用Zernike拟合)
导出设计面型(File > Export > Surface Data),用MATLAB或Python做Zernike分解:
# 用zernike_py库拟合 from zernike import RZern import numpy as np surf_data = np.loadtxt("oap_surface.txt") # x,y,z网格数据 rz = RZern(10) # 10阶Zernike coeffs = rz.fit(surf_data[:,0], surf_data[:,1], surf_data[:,2]) print("Top 5 Zernike terms:", coeffs[:5])- 若Z9(球差)、Z16(四次方球差)系数占比>70%,说明面型过于陡峭,超出现有磁流变抛光(MRF)设备能力;
- 若Z4(离焦)、Z5(散光)系数显著非零,说明坐标系未对准,需回查Coordinate Break设置。
6.3 第三步:杂散光路径扫描(简易版)
Zemax非序列模式虽强大,但序列模式也能做初步杂散光筛查:
- 在LDE末尾加一个
Detector Rectangle面; - 设置其
Absorb属性为1.0(100%吸收); - 运行
Analyze > Ray Trace > Single Ray,手动发射100条从物面边缘发出的“鬼光线”; - 观察哪些面被意外击中(如镜框内壁、支撑结构);
- 若>5%光线打到非光学面,必须在结构中增加光阑或挡光环。
最后的教训:我曾以为“Zemax跑通=设计完成”,直到加工第一块OAP时发现,理论离轴量5mm,但供应商镜坯最小离轴量是8mm——因为小于8mm时,抛光机夹具会干涉。从此,我的设计流程强制加入“供应商能力核查”环节,把《钒酸钇晶体Zemax仿真》里提到的材料限制、《Zemax多重结构编辑器设置说明》里的公差传递、甚至《你的照明系统可能才是瓶颈》强调的光源均匀性,全部前置到结构设计阶段。反射式系统没有捷径,只有把每一个坐标、每一行系数、每一次点击都当成物理现实去敬畏。希望帮到你。
本文还有配套的精品资源,点击获取