Pancake光路
Facebook发了一篇非常华丽的paper, 里面用全息(Holographic, 原教旨意义的全息, 不是各种市场部吹嘘的引申假借)做了一个超薄的VR眼镜.
完全是一副未来已来的样子.
不过我在看文献的时候, 却对里面回顾的另一个光路很感兴趣.
这个光路令光线往返了3次, 可以将光程缩短为原来的1/3, 当然也是有代价的, 代价是亮度降低到原来的25%, 不过看起来很有趣, 而且是一种通用的方案, 在其他的光路设计上也很有可能使用到. 同时, 对于其中元件的微小移动都可能造成3倍的光程变化, 对于调焦可能也很有用.
于是我就决定用Jones矢量和Jones矩阵推导一下, 看看光路中到底发生了什么.
from sympy import *
Jones矢量¶
定义常见的Jones矢量,
参考定义一定要说清楚, 不然不同书里不一样, 特麻烦, 本文的参考定义来自:
- Chipman, R. A., Lam, W., Young, G. (2019). Polarized Light and Optical Systems. Boca Raton: CRC Press, https://doi.org/10.1201/9781351129121
def jones_vector(dictname):
vector={
'linear polarized light' : Matrix([1,0]),
'θ linear polarized light': Matrix([cos(θ), sin(θ)]),
'right-hand circularly polarized light': Matrix([1/sqrt(2), -I/sqrt(2)]), # (2.35)
'left-hand circularly polarized light': Matrix([1/sqrt(2), +I/sqrt(2)]), # (2.36)
}
return vector[dictname]
例如,
- 光矢量沿x轴的线偏振光
- 光矢量与x轴π/4的线偏振光
- 右旋圆偏振光
θ=symbols('θ')
print('光矢量沿x轴的线偏振光:')
pprint(jones_vector('linear polarized light'))
print()
print('光矢量与x轴π/4的线偏振光:')
pprint(jones_vector('θ linear polarized light').subs(θ, pi/4))
print()
print('右旋圆偏振光:')
pprint(jones_vector('right-hand circularly polarized light'))
print()
Jones矩阵¶
定义常见偏振器件的Jones矩阵,
参考定义来自:
- Chipman, R. A., Lam, W., Young, G. (2019). Polarized Light and Optical Systems. Boca Raton: CRC Press, https://doi.org/10.1201/9781351129121
其中快轴(或透光轴)位于x轴方向. 采用线性Retarder对快轴保持不变的形式. 此处用力吐槽一下, 如前所见, 偏振光用二元向量描述快轴和慢轴, 偏振元件也就是改变这两的属性, 对于旋转的, 类似于调时钟的时针和分针, 也许目的只是让两者之间张开90度, 那么:
- 可以保持快轴不变, 转慢轴,
- 也可以保持慢轴不变转快轴,
- 还可以中间选个平均位置不变, 一边转快轴, 一边转慢轴
这三种都可以, 得到的转换矩阵形式上是不同的, 当然互相之间可以再转换. 但是一本书一定要写清楚, 而且要保持一致才好, 否则在看例题的时候就可能陷入混乱. 我开始看一本中文书、一本英文书, 都没说自己用了哪种定义, 中文书里还前后标准不一致, 害得我查了半天程序, 又查第三本书.
def basic_jones(dictname):
ϕ , δ=symbols('ϕ δ')
# Table 5.3 Polarizer Jones Matrices
jones_dict={
# Polarizer Jones Matrices
'polarizer' : [1,0,0,0],
'right circular polarizer': [1/2 * 1, 1/2 * I, 1/2 * (-I), 1/2 * 1],
'left circular polarizer' : [1/2 * 1, 1/2 * (-I), 1/2 * (I), 1/2 * 1],
# Linear Retarder Jones Matrices
# Fast axis unchanged convention,
# delays the phase of the slow eigenpolarization,
# leaving the fast eigenpolarization’s phase unchanged
'linear retarder': [1,0,0,exp(I*δ)],
'quarter wave plate': [1,0,0,I],
'right circular QWRCR': [1/2* (1+I), 1/2* (1+I), 1/2* (-1-I), 1/2* (1+I) ],
'left circular QWLCR': [1/2* (1+I), 1/2* (-1-I), 1/2* (1+I), 1/2* (1+I)],
'half wave plate': [1,0,0,-1],
'right circular CR': [0,I,-I,0],
'left circular LR': [0,-I,I,0],
# 查不到反射镜的Jones矩阵
# 反射过程似乎不这么简单, 但如果是垂直入射, 类比于声波可能就原路返回,
'mirror': [-1,0,0,-1],
}
a,b,c,d=jones_dict[dictname]
return Matrix([[a,b],[c,d]])
当快轴与x轴有一定角度时, 使用旋转坐标系的方式计算出具有角度的偏振器件Jones矩阵.
def rotate_jones(dictname, x=0):
R=Matrix([[cos(x), -sin(x)],[sin(x),cos(x)]])
R_inv=Matrix([[cos(x), sin(x)],[-sin(x),cos(x)]])
return R*basic_jones(dictname)*R_inv
例如:
- 水平线性偏振器
- 垂直线性偏振器
- 135度线性偏振器
- 45度1/4波片
- 135度半波片
θ, ϕ = symbols('θ ϕ')
print('Horizontal linear polarizer HLP, L(0°):')
pprint(rotate_jones('polarizer'))
print()
print('Vertical linear polarizer VLP:')
pprint(rotate_jones('polarizer' ,pi/2))
print()
print('135° Linear polarizer L(135°):')
pprint(rotate_jones('polarizer' ,pi/4*3))
print()
print('45° Quarter Wave LR (π/2, 45°)')
pprint(rotate_jones('quarter wave plate', pi/4))
print()
print('135° Half Wave LR (π, 135°)')
pprint(rotate_jones('half wave plate', pi/4*3))
print()
Pancake 光路¶
不失一般性, 设Display Panel发出水平线性偏振光.
light=jones_vector('linear polarized light')
pprint(light)
第一次光程¶
分别穿过如下光学器件:
- right circular polarizer
- beam splitter, 假设偏振性不变
- quarter wave plate
到达reflective polarizer
穿过right circular polarizer¶
由水平线性偏振光变成了右旋圆偏振光
light=rotate_jones('right circular polarizer') * light
pprint(light)
light=rotate_jones('quarter wave plate') * light
pprint(light)
到达reflective polarizer¶
视reflective polarizer为polarizer与镜面的结合, 如果reflective polarizer发生反射, 说明reflective polarizer与光线的偏振方向垂直, 所以reflective polarizer应该是135度的线性偏振器, 两者垂直, 那么光线应该无法穿过该偏振器, 也就是乘出来为0向量
reflective_polarizer = rotate_jones('polarizer', pi/4*3)
pprint(reflective_polarizer * light )
在reflective polarizer上反射¶
从x轴45度的线性偏振光仍然变成线性偏振光, 按说方向是相反的, 但我也不知道正确的镜面Jones矩阵应该怎么写, 姑且认为是线性偏振光原路返回
light = rotate_jones('mirror')*light
pprint(light)
第二次通过quarter wave plate¶
从线性偏振光变成了左旋圆偏振光
light=rotate_jones('quarter wave plate') * light
pprint(light)
在beam splitter上反射¶
继续是左旋圆偏振光, 注意, 这时候与第一次光程时的旋转方向相反了
light = rotate_jones('mirror')*light
pprint(light)
第三次通过quarter wave plate¶
从左旋圆偏振光变成了135度线性偏振光
light=rotate_jones('quarter wave plate') * light
pprint(light)
抵达reflective polarizer¶
验证一下此时能否穿过reflective polarizer, 如果可以通过, 应该跟之前一致
pprint(reflective_polarizer * light )
Q.E.D
PS.
Pancake光路也做出了很轻薄的头戴显示器, 发文章的居然是3M, 在这篇文章中, 他们使用步进电机移动beamsplitter, 造出了变焦版本的头戴显示器, 通过追踪瞳孔位置估算出人眼对焦位置, 然后再变焦, 由于3倍折叠光路以后所需要移动的位置很小, 所以响应可能更好.