本文是人眼模型的一个案例研究,并提供了更高级的序列模式建模技术的演示。我们将在OpticStudio中使用Liou & Brennan 1997眼睛模型创建人眼模型。在OpticStudio中成功生成这个眼睛模型后,我们将使用它来设计一个自由形式的渐进眼镜镜片。
准确的人眼模拟和建模是一个难题;这是一个不断激发新的发展的课题。在本研究中,我们将使用在《Optics of the Human Eye》一书中展示的Liou & Brennan 1997模型在OpticStudio中创建人眼模型1。这是一个相当全面的眼睛模型。它考虑了许多其他模型没有考虑到的现实因素,如偏置瞳孔、弯曲的视网膜表面、向内的眼球和前后半部分具有两种不同梯度折射率剖面的晶状体。
在OpticStudio中成功生成这个眼睛模型后,我们将使用它来设计一个自由形式的渐进眼镜镜片。
我们将从建立人眼模型开始。你可以使用附件中的“Human_Eye_Model.ZMX”,以跳过手工输入所有的表面。该文件在本文的“附件下载”一节中的ZIP压缩文件中可用。
如果你要手动输入而不是加载附件,你要先把OpticStudio设置为序列模式,然后设置System...General...Units...Lens Units为“毫米”。接下来,你要设置波长(在系统部分找到)为“F, d, C(可见)”,如下所示:
接下来,进入System Explorer...Aperture,设置光圈类型为Float By Stop Size,然后进入System Explorer...Glass Catalogs并添加目录MISC到您的玻璃目录。在视场数据编辑器中只设置一个视场,类型为Angle(Deg), X-Field值为5:
现在在光阑前插入3个表面,并在光阑后插入另外3个表面。下面是建立所有表面的一步一步的指导,一次一个。调整每个参数步骤如下;任何被省略的参数都应该保持默认值。
Surface 0 OBJ | |
Comment | Object |
Thickness | 1.0E+009 |
Surface 1 | |
Comment | Input Beam |
Thickness | 50 |
Surface 1只是一个虚拟平面,我们用它来让布局图更容易理解。因为我们只需要这个表面来可视化光线通过它,我们可以通过Object Properties...Draw来隐藏它,然后检查Do Not Draw This Surface。
Surface 2 | |
Comment | Cornea |
Radius | 7.77 |
Thickness | 0.55 |
Material | Model: 1.376, 50.23 |
Semi-Diameter | 5 |
Conic | -0.18 |
要设置这些材料参数,你需要右键单击玻璃单元格,从下拉列表中选择“模型”作为解决类型,然后输入值。
接下来,我们将在Surface 3插入角膜和房水之间的界面。
Surface 3 | |
Comment | Aqueous |
Radius | 6.4 |
Thickness | 3.16 |
Material | Model: 1.376, 50.23 |
Semi-Diameter | 5 |
Conic | -0.60 |
Surface 4代表系统的孔径光阑,在镜头数据编辑器中被标记为“STO”。这是我们眼睛模型的瞳孔平面。
Surface 4 | |
Comment | Pupil |
Material | Model: 1.376, 50.23 |
Semi-Diameter | 1.25 |
为了模拟偏移的瞳孔位置,我们需要偏心这个表面。打开Surface Properties,然后点击Tilt/Decenter选项卡。设置这个表面的Decenter X值为-0.5mm,然后在After surface选择Reverse This Surface,如下图所示。
现在我们将对模型晶状体的前后部分进行建模。
Surface 5 | |
Surf:Type | Gradient 3 |
Comment | Lens-front |
Radius | 12.4 |
Thickness | 1.59 |
Semi-Diameter | 5 |
n0 | 1.368 |
Nr2 | 1.978E-003 |
Nz1 | 0.049057 |
Nz2 | -0.015427 |
Surface 6 | |
Surf:Type | Gradient 3 |
Comment | Lens-back |
Radius | Infinity |
Thickness | 2.43 |
Semi-Diameter | 5 |
n0 | 1.407 |
Nr2 | -1.978E-003 |
Nz2 | -6.605E-003 |
接下来,我们将模拟晶状体后部和眼睛玻璃体之间的界面。
Surface 7 | |
Comment | Vitreous |
Radius | -8.1 |
Thickness | 16.23883 |
Material | Model: 1.336, 50.23 |
Semi-Diameter | 5 |
Conic | 0.96 |
最后,我们将在Surface 8上建模眼睛的视网膜。这在镜头数据编辑器中被标记为“IMA”,代表图像表面。
Surface 8 | |
Comment | Retina |
Radius | -12 |
Semi-Diameter | 5 |
快速检查一下系统的3D布局(第一个表面被设置为表面2,而不是默认的表面0),显示出有些东西不是很正确:
在布局图中,顶部和底部的边缘光线被瞳孔切断。这是不可能的,特别是当我们选择系统的光圈类型为Float By Stop Size:根据定义,顶部和底部边缘光线应该成功地通过瞳孔。我们的光瞳有些问题。当我们的瞳孔不可信时,我们会检查Pupil Aberration Fan(这是一个分析工具,可以在Analyze Tab...Aberrations...Pupil Aberration下找到)。我们系统的光瞳像差光扇图是这样的:
光瞳像差光扇图告诉我们在负X轴方向上有40%的瞳孔像差。这是由于OpticStudio将光线瞄准(非偏心的)近轴入瞳造成的。记住,我们让瞳孔偏离0.5mm,这是瞳孔半直径的40%,在x轴的负方向。
幸运的是,OpticStudio有一个简单的解决方法:光线瞄准(Ray Aiming),前往System Explorer...Ray Aiming,设置光线瞄准为Paraxial,如下图所示:
点击OK按钮,现在我们看到光瞳像差被消除了:
3D布局显示了成功通过偏心瞳孔的上、下边缘光线:
这是Liou & Brennan(1997)的眼睛模型。此时,你的镜头数据编辑器应该是这样的:
更改3D布局图的设置让Z旋转=90,并设置它第一表面为表面1(输入光束),你会看到自顶向下的模型,包括补偿瞳孔和离轴视场(我在下图模型的各个部分添加了一些注释标签):
为了分析这个镜头,让我们先看点列图。从Analyze Tab...Rays and Spot下拉打开标准点图:
接下来检查FFT MTF:
注意,我选择的最大频率为100 lp/mm。这相当于5 um的单点分辨率,与20/20斯内伦视力检测表要求的分辨率非常接近。你可以看到,这个模型应该能产生分辨率高达100 lp/mm的图像,因此是一个20/20人眼的好模型。
最后,为了更好地了解这个“病人”的视力,我们将检查衍射图像分析。衍射图像分析特征与几何图像分析特征相似,只是使用了复杂的系统光学传递函数(OTF)来计算图像外观。该方法考虑了实际光学系统的有限通带和其他衍射效应对成像的影响。
为此,我们将其设置为以20/20斯内伦视力检测表对应的大小来成像字母“F”。前往Analyze Ribbon...Extended Scene Analysis...Extended Diffraction Image Analysis,点击Settings,设置值如下图所示:
这是衍射图像分析图:
现在,在OpticStudio中已经建立了一个良好的人眼模型,就可以向设计中添加外部元素。例如,如果你有一个测量的得到的角膜图,你可以用“网格凹陷”表面替换角膜表面,并将数据导入OpticStudio。或者,如果你有一个特别设计的人工晶状体(IOL)模型,你可以用该模型代替两个梯度表面。
在这个例子中,我们将设计一个渐进多焦点镜头(PAL),我们将从添加一个眼镜镜片到我们的模型的前面开始。我们将优化该PAL以提供近、中、远目标的良好成像。
当“病人”上下移动他的眼睛时,为了仿真眼睛运动的模型,我们希望保持眼镜在合适的位置,并让眼睛模型围绕其中心旋转。也就是说,我们必须在眼球的中心放置一个坐标间断面,然后让整个眼球模型围绕这个点旋转。为了做到这一点,我们首先将眼镜镜片放入镜头数据编辑器,然后我们将向前移动适量的厚度,以到达眼睛的中心。然后我们会放入一个坐标中断表面,然后我们会向后移动到眼睛模型的第一个表面的理想位置,角膜。乍一看,这可能有点令人困惑,但正如您将看到的,它实际上非常简单。
首先,在输入光束(表面1)和角膜(表面2)之间插入三个表面。这三个表面将代表眼镜镜片的前表面和后表面,以及倾斜眼睛的坐标间断面。你会注意到,我将镜片放置子啊距离眼睛15mm处。
我们将把坐标间断面设置在在眼球的中心(我估计距前角膜表面大约13mm)。这样,眼睛就会以一种模仿人眼实际运动的方式围绕中心旋转。下面是设置这三个新表面的指南。
你会看到从眼镜镜片的后表面到坐标间断面(在眼球中心)的厚度是28毫米(从眼镜到角膜15毫米加上角膜到眼球中心13毫米)。然后,坐标间断面后,有一个负13mm的厚度,回到角膜表面。面2和面3分别代表眼镜镜片的前表面和后表面。
Surface 2 | |
Surf:Type | Even Asphere |
Comment | glasses-front |
Radius | 100 |
Thickness | 3 |
Material | POLYCARB |
Semi-Diameter | 20 |
Surface 3 | |
Surf:Type | Extended Polynomial |
Comment | glasses-back |
Radius | 100 |
Thickness | 28 |
Semi-Diameter | 20 |
表面4代表位于眼球中心的坐标间断面。
Surface 4 | |
Surf:Type | Coordinate Break |
Comment | center of eye |
Thickness | -13 |
现在让我们添加一些新的配置。打开多重结构编辑器(MCE),并按Ctrl-Shift-Insert两次,或按MCE工具栏中的Insert Configuration按钮。我们需要两个额外的多重结构操作数,所以现在按两次Insert。现在MCE中应该有九个空格。
我们要做的第一个结构是眼睛通过晶状体直视远处的物体。第二种配置将代表眼睛通过透镜稍微向下看,观察一个中距离物体。最后,第三个配置将代表眼睛向下看,观察一个非常近的物体。改变对象的距离是用一个THIC操作数(改变Surface 0的厚度)来处理的,改变眼睛的上下角度是通过改变Surface 4(坐标中断面)的Tilt About X(参数3)来处理的。下表列出应如何填写MCE:
我们现在有了一个镜片和一个眼球,我们设置了眼球,使它以一种现实的方式旋转。还有一个小步骤可以帮助我们更容易理解布局图:我们需要将全局坐标参考面设置为镜头数据编辑器(LDE)中的坐标间断之前的一个。这里的想法是,在我们的坐标间断面(曲面4)之后的曲面将相对于坐标中断之前的曲面倾斜一些。
当我们制作布局图时,我们希望在图中显示眼球旋转时,眼镜镜片保持在原位(而不是当眼镜围绕着眼睛移动时,眼球保持在原位)。为了确保这一点,我们转到System Explorer...Aperture,并将全局坐标参考面设置为4之前的任何面(如表面1)。
快速检查3D布局(第一个表面设置为1;旋转X、旋转Y和旋转Z的值设置为0;配置设置为All;和Y补偿设置为-50)表示有些东西不太正确:
问题是当我们的眼睛模型向下旋转时,它并不是真的向下“看”。这是因为视场值在眼睛旋转时保持不变,我们想要的是视场改变,以便聚焦的光束总是击中视网膜的同一部分(视网膜上的这个焦点被称为中央凹)。所以我们真正想保持不变的是像高,而不是视场角。为了做到这一点,我们要将视场类型从角度(Deg)更改为真实像高。
为了转换为真实像高视场定义,我们可以检查主光线的坐标,并手动将该值输入到视场数据编辑器中。但是,我们也可以使用视场转换工具。要做到这一点,从System Explorer...Fields...Open Field Data Editor打开“视场数据编辑器”,导航到“视场属性”中的“视场类型”选项卡。然后,在转换到下拉框中选择真实像高:
这将转换我们的视场类型,以便它根据实际像高定义。如果需要的话,我们可以把这些值四舍五入。通过这样设置我们的视场数据,我们将保证无论我们选择哪种配置,主光线将在X = 1.462mm, Y = 0.0处与像面相交(即视网膜)。这是一个很好的仿真情况,无论人眼旋转到哪里,视场中心总是在视网膜上的同一个精确点(中央凹)。
以下是一个3D布局图,从侧视图显示了系统的3种配置(远、中、近对象距离):
我们系统的三种结构的MTF曲线和衍射图像从远到近依次如下所示:
请注意,由于我们的模型没有包括通过晶状体的调节(以适应从远到近的物体距离的变化),系统在中距离和近的物体上显示出非常差的性能,就像我们预期的老花眼患者一样。
我们将优化眼镜镜片,使其具有自由形状,试图适应眼睛向下旋转。我们的下一步是在镜头数据编辑器 (LDE)中设置变量。我们唯一感兴趣的是改变镜片前后表面的形状。
在LDE中,设置表面2(眼镜前)的半径、圆锥和第2阶项到第12阶项为变量——这个曲面总共应该有8个参数成为变量。我们还将Surface 3(眼镜后表面)的最大值设置为40,相同表面的标准半径设置为20.0。最后,将Surface 3的所有40个多项式系数项设为变量。
在优化镜片形状之前,我们需要建立一个评价函数。在Optimize Tab...Optimization Wizard的优化函数编辑器(MFE),将优化函数和参考值设置为“RMS”、“波前”和“质心”。设置瞳孔积分方法为“高斯求积”,选择6环12臂;我们需要高采样,因为我们预计波前形状是高度复杂的,基于PAL表面轮廓自由度的数目。请注意,假设轴对称框没有选中,我们将保持默认:
点击“OK”,OpticStudio会自动为我们生成几百个优化操作数。
在我们开始优化之前,我们只需要添加几个边缘厚度操作数,以保持眼镜镜片的边缘不会变得太厚或太薄。眼镜镜片包括一个扩展的多项式表面类型,因此在优化期间它不会保持旋转对称。因此,我们必须使用操作数来检查镜头周围多个点的边缘厚度。XNEG和XXEG就是这样的操作数。我们将这些操作数添加到价值函数中,以确保眼镜镜片的边缘厚度在1到8mm之间。
在优化函数的开头插入两个新操作数。下面是这两个新操作数的设置:
第一个新操作数
Type | XNEG |
Surf1 | 2 |
Surf2 | 3 |
Zone | 0 |
Target | 1 |
Weight | 1 |
第二个新操作数
Type | XXEG |
Surf1 | 2 |
Surf2 | 3 |
Zone | 0 |
Target | 6 |
Weight | 1 |
至此,设计的所有艰苦工作都已完成。附件'Human_Eye_Model.ZMX'已经完成到此为止的所有上述工作。
剩下要做的一件事就是通过Optimize Ribbon...Optimize打开优化工具并点击开始按钮来优化设计。
一段时间后,OpticStudio将完成优化,你将得到一个有趣的,自由形式的渐进添加镜头(PAL)。在这个演示中,我们用锤形优化工具做了几个小时的进一步优化:
根据这种布局,我们可以看出我们的凹陷剖面相当极端。我们还可以通过表面凹陷分析来进一步研究。注意,在本例中,我们让优化器肆意运行。在设计将要建造的系统时,我们必须考虑成本和没有在这里做的凹陷轮廓。仔细考虑并选择向优化器公开的变量始终是一种良好的习惯。在这个例子中,我们简单地将PAL的所有40个多项式项作为变量,但实际上我们应该通过以下两种方法确定哪些是重要的因素:
使用一些基本的考虑。例如,考虑是否需要X/Y对称项,并根据此选择设置哪些项为变量。
测试哪些变量“有效”。一种常见的技术是每次向优化器提供一个变量,并检查该变量是否有帮助。如果优化器不能使用这个变量找到更好的解决方案,那么排除它可能是合理的。将它设置为0并保持不变,然后继续下一个。
合适的变量选择确保最终设计是实际的和可制造的,不太昂贵,也大大提高优化性能。不过,在这种情况下,我们将简单地继续,假设该系统是可制造的,并符合我们的物理设计规范。
我们可以看到,优化器已经为所有三种配置找到了一个非常好的解决方案。我们可以使用分析工具检查所有三种配置的性能。注意,这一次,我们的系统在所有三种配置中都有衍射限制(RMS光斑尺寸小于艾里半径),所以我们将在扩展衍射图像分析设置中检查衍射限制选项。我们新优化的系统的三种结构的MTF曲线和衍射图像如下所示,顺序从远到近:
1. Atchison, D. A., & Smith, G. (2006). Optics of the human eye. Oxford: Butterworth-Heinemann.