编辑:直接改单元格;点「表面编号」格可把该面设为光阑。
多重结构:.seq 里的 ZOO 记录(结构数、各结构标题、逐结构的 FNO / 面厚度 / 曲率 / 渐晕系数)会读进来,用工具栏「结构」下拉切换,随结构变化的格子在表里标了色,改这些格子会写回当前结构。物面厚度(ZOO THI S0)落到顶栏「物距」,因此近摄结构按有限共轭追迹:光线从物点发出而非平行入射,F/# 用像方工作 F/#(由近轴边缘光线角 1/(2|u′|) 反解入瞳),状态栏 RED 给出放大倍率。
光线瞄准默认开着:归一化瞳坐标只有定义在光阑面上才有意义。关掉的话它落在近轴入瞳上,视场一大瞳像差就把这个参数化整个扭掉——FE 14mm F1.8 GM 的 56.7° 视场上,u = −1…+1 只覆盖光阑的 +0.13…+0.84,主光线(u=0)落在 0.47 处,整束光线跑到光阑上半边,下缘瞳位置和边角 MTF 全错;FE 35mm F1.4 GM 的 32.4° 则是 u = −1 落到光阑外 1.20 倍处。规规矩矩的镜头开不开几乎没差(85 GM II / 55ZA / CODE V 对照实测 MTF 差 ≤ 0.005),代价是追迹慢一些。
渐晕:若文件带 SETVIG / VDYN·VCYN 存的 VUY/VLY/VUX/VLX,瞳区间直接按它逐视场插值取,不再靠通光孔径反推——很多 .seq 只在像面写 CIR,镜片没有孔径数据,这时这张表是唯一依据。
一键渐晕:文件存的系数常常和它自己的通光对不上(Zemax 的浮动通光逐结构重算,系数却只存了一份),画出来就是光线穿出镜片。按 CODE V 的 SET VIGNETTING 重算当前结构的渐晕系数——把 ±Y / ±X 四条边缘光线二分推到「刚好通过全部真实通光」为止,21 个视场点,能收紧也能放开。判据只认写死的通光(CODE V 的 CIR、Zemax 的固定 DIAM 与浮动通光 FLAP);自动算出来的 DIAM 是光线包络反推的,不是物理孔径,不参与;光阑面也不参与——归一化瞳坐标 ±1 定义的就是它的边缘,它不会渐晕自己。弧矢跨度在子午瞳的中心那一行量,不是在 y = 0 上量:渐晕后的瞳是偏心的(FE 85mm F1.4 GM II 最大视场瞳心在 −0.32),在 y = 0 上量等于量到瞳边缘的一条弦,弧矢瞳会小掉一大截(0.52 而不是 0.86),MTF 反而虚高。Zemax 的 VDX/VCX 也是这个意思——X 边缘光线走的是 Py′ = VDY 那一行。库里的镜头已经逐结构预先跑过一遍(tools/setvig.js),载入即生效,按钮显示为「渐晕:按通光」;再按一下即换回文件自带的系数,可以直接看出偏了多少,Ctrl+Z 也能来回。没有渐晕系数的镜头(瞳本来就按通光实时追迹)不预算;另外几种情况也有意跳过并在提示里说明原因:写死通光的面数达不到下限(至少 4 个面、且至少占总面数的 20%;拿 3 个面去解 21 个视场的渐晕剖面,解出来的瞳只是这 3 个面的形状,和真实镜筒无关)、真实通光太少(定不出渐晕剖面)、通光够多但全程只有一个面在限制光瞳(真正卡光的面没写进文件,放开只会把瞳算得比实际大),以及写死的通光其实挡不住任何光线——按文件自带的渐晕系数追一遍包络,如果每个通光都 ≥ 自己的包络,说明它们只是被 Zemax 的 Set Semi-Diameters 冻结下来的自动半口径,不含新信息(FE 16mm F1.8 G 的 S16 写死 8.80,而文件渐晕追出来的包络正好是 8.8025)。这几种都保留文件自带的系数,按钮仍可手动按。拿带 SETVIG 的 CODE V 文件反过来校验,本页重算的系数与文件自带的差 ≤ 0.03(归一化瞳坐标,满瞳半宽 = 1)。
撤销:所有改动(含「最佳对焦」写入的离焦量、插删面、波长预设、粘贴)都可 撤销 / 重做,快捷键 Ctrl+Z / Ctrl+Shift+Z(光标停在输入框里时让给浏览器的文本撤销);恢复初始回到刚载入示例或刚导入 .seq 时的状态,这一步本身也能撤销。
粘贴:从 Excel / 专利表格复制多行多列,选中起始格 Ctrl+V 即整块填入(列顺序 Y 半径→厚度→玻璃→半孔径→圆锥→A4 A6 A8…),行数不够会自动补。
非球面:A4 A6 A8… 每项一列,列不够时最右会自动多出一列;表格可左右滚动。奇次非球面把第一格写成 ODD,后面各列就依次是 r¹ r² r³ … 的系数(r 的任意整数次幂,对应 Zemax 的 XOSPHERE、专利里印成 A3…A10 那种);不写 ODD 就是默认的偶次 r⁴ r⁶ r⁸…,两种写法互斥、整行二选一。
材料:直接写牌号,内置 — 种厂商目录玻璃(SCHOTT / OHARA / HOYA / HIKARI / CDGM / SUMITA / NHG / CHINA / SPECIAL 等 19 家),输入时会自动补全;重名可用 牌号_目录 指定(H-ZF72A_CDGM、NBFD25_HOYA、SBSL7_OHARA)。查不到的写 nd/vd(如 1.7292/54.7)或 6 位 MIL 代码(如 517640)按模型玻璃算;写 nd/vd/ΔPg,F 三段可指定反常色散。玻璃偏移解写成 牌号~Δnd~Δνd(如 S-NBH52V~-0.00735~-2.6561):照搬基准玻璃的色散曲线形状、只把 nd 和 νd 挪到偏移后的值,相对部分色散不变,对应 Zemax 的 GLAS … 4 … Δnd Δνd,专利仿真里用来还原没有等效牌号的元件。留空为空气。CODE V 的数字式虚拟玻璃 nnnnnn.vvvvvv(如 560412.639175 → nd 1.560412 / νd 63.9175,整数部分 =(nd−1)×10⁶、小数部分 = νd/100)也认,常见于複合型非球面的树脂层;认不出来整个面会被当成空气,所以宁可解错也要解。但这只是兜底,解出的 νd 已知不可信——同一片树脂,原始文件写的是 1.56093 / 36.6,CODE V 重导出后按上式解出来是 63.9175。每遇到一个都会把面号和解出的值列进导入提示;出现这种写法基本说明该文件是 CODE V 往返导出的产物,建议回去用原始文件。
导入:CODE V .seq 读面数据 / CIR 通光 / ASP 非球面 / STO / FNO / WL·WTW·REF / YRI·YAN / SETVIG 渐晕 / ZOO 多重结构 / 数字式虚拟玻璃;Zemax .zmx(UTF-16 或 UTF-8)读 SURF·CURV·DISZ·GLAS·CONI·PARM / STOP / FNUM·ENPD / FTYP·YFLN / WAVM·PWAV / VDYN·VCYN 渐晕 / MNUM·THIC·APER·FVCY 多重结构。两种格式走的是同一份解析代码,命令行批量转换用的也是它。
| # | 波长 nm | 权重 | 占比 | 绘图颜色 | 主 |
|---|
预设:可见光 5 线(10/27/29/23/11)、VIS Weighted(C–g 五线按 5500 K 黑体加权,权重 0.898/0.973/1.000/0.984/0.911)、Leica Weighted(短端截到 455 nm、长端用 C′ 线 643.8 nm,权重 7/8/9/7/4)、日本厂商光谱权重(3/22/30/12/3,重心压在 e 线)。主波长一律取 546.1 nm(e 线绿光)——「F d C 等权」和「d 单色」里没有这条线,只能退回 d 线 587.6。绘图颜色按波长的真实谱色算:CIE 1931 配色函数(Wyman/Sloan/Shirley 多高斯拟合)→ sRGB,出色域直接截负、色相饱和度不动、亮度归一到同一目标,所以深浅两个主题下都看得清。改波长会自动重算颜色。
权重按通量参与多色 MTF 合成——各波长的复数 OTF 加权求和后取模,参考点是多色质心,因此色焦移会如实压低 MTF。主波长用于近轴量、光线瞄准、衍射极限参考线和单色 Layout。颜色可点开手动改,改到波长上就会被重算回谱色。Layout 切到「按波长着色」时使用(同时用线型区分,不只靠颜色)。
算的是什么:几何点列图。镜头结构、光圈、像面位置都按当前状态不动,物点放在三个物距上——对焦物距(当前「物距」,无限远也可以),以及自动搜出来的焦后(更远)和焦前(更近)两个物距:搜索条件是轴上离焦光斑外径 = 目标光斑(默认 400 µm),在 1/物距 上两轮网格 + 插值。无限远对焦只有焦前。每一行共用同一组物方视场角(按当前视场定义等分,视场角在对焦物距上换算)。
光斑形状从哪来:瞳面在光阑上分层随机采样,每条光线瞄准光阑;谁把光线挡掉决定了形状。镜头有足够多写死的真实通光(CIR / 固定 DIAM / FLAP,门槛和「一键渐晕」一样:≥4 个面且 ≥20%)就逐面裁剪,猫眼是真的;不够就退回渐晕系数给的等效椭圆瞳,光斑只能是椭圆——用的是哪种写在图下面。400 µm 量级的离焦盘上衍射没有意义,不算。
读数:D = 全部波长落点离主光线的最大距离 ×2;rms = 主波长落点对自身质心的 RMS;T = 主波长通过率(瞳面均匀采样里通过的比例)。每一行按该行最大光斑取同一比例尺,所以同一行里格子之间的大小可以直接比。亮度映射:能量占 90% 的阈值映到中灰,再往上柔和压到白,离焦盘的亮环和对焦光斑的核心都看得见。
怎么画的:普通点列图。瞳面分层随机取点,每条光线追到像面点亮一个像素,各波长按颜色叠加,密处到白。颜色按「无渐晕的均匀盘应当是白的」做了白平衡,色边才是真的色差而不是权重偏色。不做衍射。
性能:计算在 Web Worker 里,界面不冻,逐格出图并有进度条。默认每格每波长 10 万条,5 波长 × 6 视场 × 3 行 = 900 万条,约 30 s;「30 万」约 3 倍。和 MTF 用同一套追迹内核,参数改了之后这张图不会自动重算,右上角会标「已过期」。
A 用冷色、B 用暖色,同一颗镜头里颜色深浅区分频率;实线 = 子午 T,虚线 = 弧矢 S(与主页面同一约定)。 两边共用光谱、频率、算法、瞳面网格和视场点数,孔径 / 视场定义 / 渐晕仍各自按文件走——这是镜头本身的规格,强行统一反而不是那颗镜头了。 光谱默认统一到可见光 5 线(10/27/29/23/11,主波长 546.1 nm):两颗镜头文件自带的谱段常常不一样,不统一就不是同一把尺子;选「各自文件自带」才各按各的。 横轴选「实像高」时两颗按各自的毫米数画,画幅不同的镜头这么比才有意义;选「归一化视场」则各自压到 0~1,比的是相对边缘表现。 各自最佳对焦勾上后,每颗镜头各自解一次轴上最小 RMS 离焦再算 MTF——文件后焦有零头时(比如取整过的空气间隔)用它比才公平。 渐晕默认用镜头库里预先按通光重算过的那份(和主页面一致);渐晕用文件原值勾上后退回文件自带的系数,可以直接看出文件的渐晕表偏了多少。
序列面实光线追迹(球面 / 二次曲面 / 偶次非球面);玻璃取自内置的 19 家厂商目录(3074 种牌号),按各自目录公式求折射率(Laurent 幂级数 / 厂商 Sellmeier / 标准 Sellmeier / Herzberger);查不到的牌号可写 nd/vd 或 6 位 MIL 代码,按 Conrady 模型玻璃处理;入瞳位置由近轴矩阵求解;
每视场 3 条光线:上下两条取该视场未渐晕瞳区间的边缘,中间那条牛顿迭代瞄到光阑面 (0,0),即真正的主光线——在入瞳里取 u=0 只有瞳像差为零时才等价,A2028 这种广角反远距在 35° 上会偏到光阑面下方 0.38 mm。光阑符号画在真实光阑半径处:面上写了 CIR 用 CIR,没写就用轴上满孔径光线在光阑面的实际落点(该 F/# 下真正起限制作用的半径;近轴值 EPD/2·|pupilMag| 只作兜底)。因此「光线瞄准」现在不再要求光阑面有 CIR。开启后每条光线牛顿迭代精确瞄到光阑面(同 Zemax Ray Aiming);渐晕由各面 Y 半孔径决定。
对齐 CODE V 的 MTFVSFLD 宏:该宏先跑 setvig 求渐晕因子,再调 mtf 命令,取的是衍射 MTF。
衍射模式(默认):按渐晕因子把通光瞳建模成缩放+偏心的等效椭圆瞳,瞳内均匀取样、由实光线光程算波前 OPD,OTF = 圆孔径解析面积因子 × 波前相位平均 ⟨eiΔφ⟩,多波长按通量加权合成复数 OTF。截止频率按「像空间方向余弦」上的瞳半宽定,不是拿 F/# ÷ 归一化瞳半宽:归一化瞳坐标到方向余弦的映射在离轴上被大幅压缩,视场越大压得越狠——实测最大视场的压缩比与归一化半宽之比,135mm 是 ×0.95、85mm ×0.86、35mm ×0.53、16mm ×0.46。照归一化半宽定截止频率,等于把瞳当成没被压缩过,剪切量偏小、边缘视场 MTF 系统性虚高(FE 16mm F1.8 G 角落 80 cyc/mm 会报 0.58,独立的严格二维积分是 0.32,Zemax 也是 0.32)。现在逐波长在瞳缘追 16 条探针光线量出真实的方向余弦瞳半宽,νc = 2 × 半宽,轴上退化成原来的 F/#(读数变化 ≤ 0.001)。剪切取样在瞳缘用「按可用角点归一化的双线性」(不再退回最近邻——最近邻会把最多半格的坐标误差当成波前差,在 PV 大的视场上折算成几个弧度的相位噪声,与 32² 网格收敛值的最大偏差因此从 0.030 降到 0.011)。
内核算得快了一倍(2026-09-06):非球面高次项改按 r² 的幂递推、矢高与斜率一次算完、
折射率按 (面, 波长) 记忆化,追迹与光线瞄准各快约 1.9 倍,切镜头的等待时间少了一半以上。
一键渐晕不再在「挡没挡住」上定步长二分 24 次,改成在口径余量
(max(落点半径 / 通光) − 1,连续函数,零点就是瞳缘)上用带保护的假位法求根,
8~10 次就收到 1e-9,比二分跑满还准。代价是 Math.pow 换成乘法后不再逐位相同:
实测一阶量变化 5.7e-16、全库 MTF 读数最大变化 5.2e-7、渐晕系数最大变化 7.1e-8,
都在数值噪声量级。
波前比瞳多采一圈:OTF 是把瞳沿剪切量 ±s 平移后自相关,只采到瞳边为止的话,靠边那一圈的平移点落在采样区外,只能拿残缺的 2×2 模板插值,而那里正是波前斜率最大的地方——结果系统性偏高,且加密网格也不收敛到正确值(FE 85mm F1.4 GM II 轴上 30 cyc/mm:24² 给 0.871、96² 给 0.811,而严格二维积分是 0.797)。现在多采「最大剪切量 + 2 格」一圈(外圈绕开通光追,瞳形状已由等效椭圆完整描述),平移点总落在采到的区域里,24² 就给 0.796,各档网格之间只差 0.01 以内。
几何模式:对像面光斑直接做傅里叶变换取模,不含衍射,轴上会系统性偏高。
三条都用实光线算,不走赛得系数。纵向球差:轴上光线在归一化瞳高 ρ 处与光轴的交点减去像面 z——曲线底端不归零,那段偏移就是轴向色差。像散场曲:以主光线为中心在光阑面取 ±2% 瞳半径的一对光线(科丁顿构型的实光线版),子午取两条的交点、弧矢取 x=0 的位置,都换算成到像面的轴向距离;实线 = 子午 T、虚线 = 弧矢 S,与上面 MTF 图同一约定(注意 Zemax 的场曲图默认是反过来的:实线 S、虚线 T)。畸变:主光线实像高与近轴主光线在像面上的高度之比,不是 f·tanθ——像面不在近轴焦点上时两者会差几个千分之一,老式三片结构能差到 0.47%。参考光线不受通光孔径限制,否则大视场上整条会消失。
页面最下面那张,布局照 CODE V 的 RIM:每个等分像高视场一行,左格子午(Δy 随子午瞳坐标)、右格弧矢(Δx 随弧矢瞳坐标),最上面是最大视场,默认 6 个视场点。横轴一律取整个入瞳的归一化坐标 −1…+1,曲线只画在该视场未渐晕的那一段——边缘视场短一截就是渐晕,和 CODE V 的图一个道理。纵向零点取该视场主光线在主波长下的落点,各波长上下错开即倍率色差。所有格子共用一个对称刻度:官方宏 cvquickrim.seq 的做法就是先扫一遍全部视场 × 波长的最大像差、再用 SSI 给每个变焦位统一设定,这里照搬。轴上那一行的子午扇实测严格奇对称(21 个采样点无一例外),是这条链路的一个硬校验。
.seq 的 ZOO 记录和 .zmx 的 MNUM / THIC / APER / FVCY 都会读进来——结构数、各结构标题、逐结构的 F/# 与面厚度 / 曲率 / 渐晕系数,用工具栏「结构」下拉切换,随结构变化的格子在表里标了色,改这些格子会写回当前结构。物面厚度落到顶栏「物距」,近摄结构按有限共轭追迹:光线从物点发出而非平行入射,F/# 用像方工作 F/#(由近轴边缘光线角 1/(2|u′|) 反解入瞳),状态栏 RED 给放大倍率。70 mm 微距的 1.0X 结构实测放大率 −0.9975,SIGMA 35 的 MFD 结构 −0.2004。
渐晕:文件里若存了 CODE V 的 SETVIG 系数或 Zemax 的 VDY/VCY,瞳区间直接按它逐视场插值取,不再靠通光孔径反推——很多文件只在像面写 CIR,镜片没有孔径数据,这时这张表是唯一依据。两家的约定不同,统一换算成 CODE V 那套:VUY = VCY − VDY、VLY = VCY + VDY。
这套系数写在哪套坐标上,取决于文件里的光线瞄准开关(.zmx 的 RAIM):关瞄准时归一化瞳坐标落在近轴入瞳上,开了才落在光阑面上,而本页一律按光阑坐标算。大视场上两者差很远——FE 16mm F1.8 G 最大视场文件写的 [−0.577, 0.913] 换到光阑上其实是 [−0.510, 0.236],上缘差 0.68,直接混用会把边角 MTF 整个算错。导入时按文件的 RAIM 判断,关瞄准的文件由 tools/setvig.js 逐视场实光线追迹换算,并在提示里写明换算前后的瞳区间。
CODE V .seq 读面数据 / CIR 通光 / ASP 非球面 / STO / FNO / WL·WTW·REF / YRI·YAN / SETVIG / ZOO。Zemax .zmx(UTF-16 或 UTF-8 自动识别)读 SURF·CURV·DISZ·GLAS·CONI·PARM / XDAT(扩展非球面 XASPHERE 能到 r¹⁸ / r²⁰,扩展奇次非球面 XOSPHERE 带 r 的奇数次项,系数都按归一化半径换算回 r 的实际幂次) / STOP / FNUM·ENPD / FTYP·YFLN / WAVM·PWAV / VDYN·VCYN / RAIM(光线瞄准开关,决定渐晕系数写在哪套瞳坐标上) / MNUM·THIC·APER·FVCY。网页拖入和命令行批量转换走的是同一份解析代码。
有意不导入的:Zemax 的 FLAP 浮动通光(逐结构重算,文件里只存了当前结构那一份,套到近摄结构会把边缘光线全挡掉;有渐晕系数时瞳已被完整定义)、多重结构里换玻璃(GLSS)、偶次非球面的 r² 项(PARM 1)、X 视场、非毫米单位——这些都只给提示,不闷声跳过。
MTF-视场图按算出来的视场点用单调三次 Hermite(PCHIP)连线:过每一个点、不在点之间拱出多余波峰,只改画法不改数值。默认视场点 15 个(可选 6…31);实测 11 / 15 / 31 点画出的曲线几乎重合,说明剩下的起伏是模型的真实结构而不是取样不足。
绘图颜色不是挑的,是按波长算出来的真实谱色:CIE 1931 配色函数用 Wyman/Sloan/Shirley (2013) 的多高斯拟合,转 sRGB。 两处工程化处理:出色域直接截负而不是去饱和——谱色截出来才是常见的彩虹,去饱和会把 656 nm 的深红推成粉; 色相和饱和度保持不动,只把亮度归一到统一目标,否则黄绿在浅色底上、蓝紫在深色底上都会看不清。 拟合的尾巴在 680 nm 以上会失真(x̄ 与 ȳ 交叉,750 nm 会算成绿色),所以色相取值夹在 385~680 nm,可见区外再往灰里调一点。 一个已知局限:520~560 nm 在 sRGB 里全部落在色域外的同一侧,截负后都是同一个绿,532 和 546 分不开——这是 sRGB 色域的限制,不是算错。 网页、镜头库 JSON、命令行转换用的是同一个函数,颜色必然一致。
SCHOTT 504 / OHARA 499 / HOYA 438 / HIKARI 318 / CDGM 323 / SUMITA 320 / NHG 215 / CHINA 135 / CORNFR 100 / CHANCE 73 / PILKINGTON 31 / SPECIAL 46(熔石英、CaF2、蓝宝石、Ge、ZnSe、PMMA…)等共 19 家。「玻璃」列有牌号自动补全;重名(如 BAF3)按 SCHOTT→OHARA→HOYA→HIKARI→CDGM→SUMITA… 的优先级取,也可写 H-ZF72A_CDGM 这种牌号_目录形式指定。CODE V / Zemax 的 NBFD25_HOYA、SBSL7 这类带后缀或去连字符的写法都能识别。
精度核对。与厂商 Excel 的 nd 逐一对比:OHARA 126 种最大偏差 5.1e-6、HOYA 159 种 4.9e-6、HIKARI 151 种 4.1e-8;另用 MIL 代码反查全库,SCHOTT 99.4% / OHARA 99.2% / CDGM 99.7% 命中(不命中的多是 nd>2 或 vd>100 无法编码成 6 位)。注意 CDGM 用的是 2024-06 版目录,与 2026-03 版相比有 35 种牌号 nd 偏差达 1.9e-3。
16 颗镜头 × 结构逐一反解「实像高 → 视场角」,主光线落点与目标一致到 1e-5 mm;厚透镜焦距与解析式一致到 1e-6;小孔径实光线落点与近轴焦点相差 6e-5 mm;瞄准落点与目标一致到 1e-5 mm;波前为零时衍射 MTF 精确复现圆孔径解析式(1e-16);单片球差波前呈 ρ4 且随孔径 ∝1/F#4;追迹出的瞳区间与 CODE V SETVIG 存的 VUY/VLY 相差 0.002~0.04。
对 CODE V 实测(索尼 55ZA,3 像高 × 3 频率 × T/S):衍射模式轴上偏差 +0.002~+0.005;离轴仍偏高 0.03~0.08,原因是瞳取样在光阑面而非出瞳,未补偿离轴瞳像差。几何模式全场 RMS 偏差 0.015,但轴上系统性偏高。
① 交点求解原来直接从光线起点解二次方程、按 |t| 最小取根;起点远在面后方时(有限物距、或首面曲率半径很大)最小根会落到球面另一侧——70 mm 微距的 1.2M 结构就这样把第 1 面落点解成 −9.7 而不是 +11.4。现在一律先平移到该面切平面再解。② 「实像高 → 视场角」原来用牛顿迭代,大角度上主光线追不通时会直接退回初值;现在改成先夹住再二分,且遇到追不通会把步子收回来。另外物距超过 10 km 一律按无限远:文件里的「无限远」常写成 1e10~1e15,真按有限共轭算,光程累加到那个量级时双精度误差已是微米量级,波前直接失去意义。
衍射 MTF(需波前 OPD → FFT)、点列图、优化与公差、变焦位置、反射面与偏心倾斜。与 Zemax / CODE V 对照时请用它们的 几何 MTF,视场取相同角度点。