Ansys Zemax | 如何在 OpticStudio 中模拟人眼

2023-11-23 17:59

本文主要是介绍Ansys Zemax | 如何在 OpticStudio 中模拟人眼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是人眼模型的一个案例研究,并提供了更高级的序列模式建模技术的演示。我们将在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

优化PAL

至此,设计的所有艰苦工作都已完成。附件'Human_Eye_Model.ZMX'已经完成到此为止的所有上述工作。

剩下要做的一件事就是通过Optimize Ribbon...Optimize打开优化工具并点击开始按钮来优化设计。

一段时间后,OpticStudio将完成优化,你将得到一个有趣的,自由形式的渐进添加镜头(PAL)。在这个演示中,我们用锤形优化工具做了几个小时的进一步优化:

根据这种布局,我们可以看出我们的凹陷剖面相当极端。我们还可以通过表面凹陷分析来进一步研究。注意,在本例中,我们让优化器肆意运行。在设计将要建造的系统时,我们必须考虑成本和没有在这里做的凹陷轮廓。仔细考虑并选择向优化器公开的变量始终是一种良好的习惯。在这个例子中,我们简单地将PAL的所有40个多项式项作为变量,但实际上我们应该通过以下两种方法确定哪些是重要的因素:

  1. 使用一些基本的考虑。例如,考虑是否需要X/Y对称项,并根据此选择设置哪些项为变量。

  2. 测试哪些变量“有效”。一种常见的技术是每次向优化器提供一个变量,并检查该变量是否有帮助。如果优化器不能使用这个变量找到更好的解决方案,那么排除它可能是合理的。将它设置为0并保持不变,然后继续下一个。

合适的变量选择确保最终设计是实际的和可制造的,不太昂贵,也大大提高优化性能。不过,在这种情况下,我们将简单地继续,假设该系统是可制造的,并符合我们的物理设计规范。

我们可以看到,优化器已经为所有三种配置找到了一个非常好的解决方案。我们可以使用分析工具检查所有三种配置的性能。注意,这一次,我们的系统在所有三种配置中都有衍射限制(RMS光斑尺寸小于艾里半径),所以我们将在扩展衍射图像分析设置中检查衍射限制选项。我们新优化的系统的三种结构的MTF曲线和衍射图像如下所示,顺序从远到近:

参考资料

1. Atchison, D. A., & Smith, G. (2006). Optics of the human eye. Oxford: Butterworth-Heinemann.

这篇关于Ansys Zemax | 如何在 OpticStudio 中模拟人眼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/419723

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

AMAZING AUCTION(简单模拟)

AMAZING AUCTION 时间限制: 3000 ms  |  内存限制: 65535 KB 难度:4 描述 Recently the auction house hasintroduced a new type of auction, the lowest price auction. In this new system,people compete for the lo