3. 符号规则与光线追迹:国际符号规则、光线追迹的基本流程、近轴光线追迹公式
好,我们进入第三讲。前两讲我们把近轴光学的核心概念——光轴、近轴区、理想像——都聊透了。但光有概念不行,你得能算。怎么算?第一步,就是给光线和光学系统定一套统一的“语言”。
这套语言,就是符号规则。没有它,你算出来的东西别人看不懂,甚至你自己换个方向就算错了。我当年刚入行时,就因为符号搞反,一个简单的双胶合透镜设计,愣是折腾了两天没对上焦。后来发现,就是符号规则没统一。
3.1 国际符号规则:给光线一个坐标系
说白了,符号规则就是给光线在空间中的位置和方向定个正负号。国际上最通用的,是笛卡尔符号规则。它的核心就一句话:光线从左向右传播。
具体怎么定?我习惯这样记:
- 光轴方向:光线传播方向为正。通常我们设光轴为 Z 轴,从左到右为正。
- 垂直方向:光轴以上为正,光轴以下为负。这对应 Y 轴。
- 角度:从光轴(或法线)转向光线,逆时针为正,顺时针为负。这个容易搞混,你想想看,逆时针是数学上的正方向。
- 曲率半径:球面的曲率中心在顶点右侧时,曲率半径为正;在左侧时为负。
- 距离:沿光轴方向,从参考点(比如顶点、物点)到下一个参考点,顺光线方向为正,逆光线方向为负。
核心原则:所有几何量(长度、角度)都是有方向的。正负号不是数学游戏,它直接决定了透镜是汇聚还是发散,像是实像还是虚像。
为了让你一眼看明白,我画了张图。这张图把符号规则的核心要素都标出来了,你对照着看,会清晰很多。
我的小习惯:每次开始一个新的光学设计,我做的第一件事就是在纸上画一条水平线,标上“+Z”和“+Y”。然后所有数据都对着这个坐标系写。这能避免90%以上的低级错误。
3.2 光线追迹的基本流程:从物到像的“行军路线”
有了符号规则,我们就可以开始追迹光线了。光线追迹,说白了就是模拟一条光线从物点出发,经过一个个光学面,最终到达像点的过程。
基本流程是这样的:
- 定义初始光线:确定光线的起始点坐标(物点位置)和方向(孔径角或视场角)。
- 计算与第一个面的交点:光线从当前位置传播,直到碰到第一个光学面(透镜表面)。求出交点的坐标。
- 计算入射角:在交点处,作该表面的法线。计算光线与法线的夹角,即入射角。
- 应用折射定律(斯涅尔定律):根据入射角和两侧介质的折射率,计算出折射角。
- 确定出射光线:以新的方向和交点作为起点,得到出射光线。
- 重复步骤2-5:将出射光线作为下一面的入射光线,继续追迹,直到光线穿过所有光学面。
- 到达像面:最后一条出射光线与像面的交点,就是这条光线的像点位置。
核心思想:光线追迹就是一个“传递-折射-再传递”的循环过程。每一步都只关心当前面和下一个面,不关心全局。这种“局部计算、全局串联”的思路,是光学计算的基础。
这个流程,我用一张流程图帮你梳理一下。你跟着箭头走一遍,就能理解整个逻辑链条。
我曾经踩过的坑:在循环判断时,忘记处理“全反射”的情况。当光线从光密介质射向光疏介质,且入射角大于临界角时,就没有折射光线了。程序会直接报错。所以,在“应用折射定律”这一步,一定要加一个全反射判断。
3.3 近轴光线追迹公式:把复杂问题简单化
上面说的是一般光线的追迹流程,计算量很大,涉及三角函数。但在近轴区,我们有个大杀器——近轴近似。
还记得第二讲说的吗?近轴区内,角度很小,所以 sin θ ≈ θ,tan θ ≈ θ,cos θ ≈ 1。这个近似,把复杂的三角函数计算,变成了简单的线性代数运算。
近轴光线追迹的核心公式,其实就两个:
3.3.1 传递公式(Transfer Formula)
光线从一个面传播到下一个面,它的高度会变化。公式很简单:
y₂ = y₁ + d * u₁'
其中:
- y₁:光线在当前面上的高度
- u₁':光线离开当前面后的孔径角(近轴角,单位是弧度)
- d:当前面到下一个面的轴向距离(注意符号!顺光线为正)
- y₂:光线在下一个面上的高度
3.3.2 折射公式(Refraction Formula)
光线经过一个球面折射,它的角度会改变。公式是:
n' * u' - n * u = - (n' - n) * y / R
或者写成更常用的形式:
n' * u' = n * u - (n' - n) * y / R
其中:
- n, n':分别为入射介质和出射介质的折射率
- u, u':分别为入射角和出射角(近轴角)
- y:光线在球面顶点处的高度
- R:球面的曲率半径(带符号!)
公式的物理意义:折射公式的本质是“光焦度”的贡献。右边第二项 (n' - n) * y / R 就是球面产生的偏折量。曲率半径 R 越小,折射率差越大,偏折就越厉害。
3.3.3 完整的追迹流程(近轴版)
把传递和折射结合起来,就是近轴光线追迹的完整流程。我习惯用一个表格来记录每一步的计算结果,这样非常清晰。
| 步骤 | 操作 | 输入 | 公式 | 输出 |
|---|---|---|---|---|
| 1 | 初始化 | 物点 y₀, 孔径角 u₀ | — | 初始光线参数 |
| 2 | 传递到第1面 | y₀, u₀, 距离 d₀ | y₁ = y₀ + d₀ * u₀ | 第1面高度 y₁ |
| 3 | 在第1面折射 | y₁, u₀, n₀, n₁, R₁ | n₁*u₁ = n₀*u₀ - (n₁-n₀)*y₁/R₁ | 出射角 u₁ |
| 4 | 传递到第2面 | y₁, u₁, 距离 d₁ | y₂ = y₁ + d₁ * u₁ | 第2面高度 y₂ |
| 5 | 在第2面折射 | y₂, u₁, n₁, n₂, R₂ | n₂*u₂ = n₁*u₁ - (n₂-n₁)*y₂/R₂ | 出射角 u₂ |
| ... | ... | ... | ... | ... |
| N | 传递到像面 | y_last, u_last, d_last | y_img = y_last + d_last * u_last | 像点高度 y_img |
你看,整个过程就是反复套用这两个公式。没有三角函数,没有复杂运算。这就是近轴光学的魅力——用最简单的数学,描述最核心的光学行为。
我的建议:刚开始学的时候,别急着写代码。拿一支笔,一张纸,对着一个单透镜,手动算一遍从物点到像点的完整追迹。算完三个面,你就能彻底理解这两个公式是怎么工作的。我当年就是这么干的,效果比看十遍书都好。
3.4 一个完整的计算示例
光说不练假把式。我们来看一个具体的例子。
系统参数:
- 一个单透镜,折射率 n = 1.5
- 第一面曲率半径 R₁ = +100 mm(凸面朝左)
- 第二面曲率半径 R₂ = -100 mm(凸面朝右)
- 透镜厚度 d = 10 mm
- 物在透镜前 200 mm 处,物高 y₀ = 10 mm
- 初始孔径角 u₀ = 0(轴上物点发出的平行光?不,这里是有限远物点,我们取一条从物点出发到第一面顶点的光线,其角度 u₀ = y₀ / (-200) = -0.05 rad)
追迹过程:
步骤1:初始化
y₀ = 10 mm, u₀ = -0.05 rad, n₀ = 1.0 (空气)
步骤2:传递到第一面
d₀ = 200 mm (物到第一面)
y₁ = y₀ + d₀ * u₀ = 10 + 200 * (-0.05) = 10 - 10 = 0 mm
(嗯,这条光线刚好打到第一面的顶点上,简化计算)
步骤3:在第一面折射
n₁ = 1.5, R₁ = +100 mm
n₁ * u₁ = n₀ * u₀ - (n₁ - n₀) * y₁ / R₁
1.5 * u₁ = 1.0 * (-0.05) - (1.5 - 1.0) * 0 / 100
1.5 * u₁ = -0.05
u₁ = -0.03333 rad
步骤4:传递到第二面
d₁ = 10 mm (透镜厚度)
y₂ = y₁ + d₁ * u₁ = 0 + 10 * (-0.03333) = -0.3333 mm
步骤5:在第二面折射
n₂ = 1.0 (空气), R₂ = -100 mm
n₂ * u₂ = n₁ * u₁ - (n₂ - n₁) * y₂ / R₂
1.0 * u₂ = 1.5 * (-0.03333) - (1.0 - 1.5) * (-0.3333) / (-100)
u₂ = -0.05 - ( -0.5 * -0.3333 / -100 )
u₂ = -0.05 - (0.16665 / -100)
u₂ = -0.05 - (-0.0016665)
u₂ = -0.04833 rad
步骤6:传递到像面(假设像面在透镜后某处,我们需要求像距)
设像距为 d₂,像点高度 y_img = 0(轴上点)
y_img = y₂ + d₂ * u₂ = 0
-0.3333 + d₂ * (-0.04833) = 0
d₂ = -0.3333 / -0.04833 ≈ 6.896 mm
像在透镜后约 6.9 mm 处。
注意:这个例子中,我们追迹的是一条从物点出发、经过透镜顶点的光线。实际追迹时,你需要追迹多条不同高度的光线,才能确定像的大小和位置。但原理完全一样,就是反复套用传递和折射公式。