一种镜头色散效果的生成方法转让专利

申请号 : CN201010562530.7

文献号 : CN102034251B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 吴佳泽郑昌文

申请人 : 中国科学院软件研究所

摘要 :

本发明属于计算机图形学领域,具体涉及一种镜头色散效果的生成方法。本方法首先利用光线追踪方法精确地计算出入(出)射光瞳的位置,然后利用高斯光学理论和光线追踪方法确定入(出)射光瞳的直径,然后顺序并逐个取出相机镜头中光学元件的结构信息,计算输入光线包中每一活状态光线经当前所取元件后的光线,得到更新后的光线包;将通过相机镜头最后一光学元件后得到的光线包作为出射光线包;最后光谱绘制模块利用所得出射光线包生成该相机的镜头色散效果。与现有技术相比,本发明绘制结果更加真实和准确、且光线追踪效率高,能够模拟任何相机镜头的色散效果。

权利要求 :

1.一种镜头色散效果的生成方法,其步骤为:

1)根据相机镜头中顺序存储的光学元件的结构信息,利用光线追踪方法计算入射或出射光瞳的位置及其孔径;所述光学元件的结构信息包括:半径、厚度、光谱折射率、孔径;

2)将计算出的入射或出射光瞳作为一光学元件加入到该相机镜头中;

3)输入一包含有K条不同波长光线的光线包(R1...RK),每一条光线具有一状态:活光线或死光线,如果一光线未被相机镜头的某一光学元件阻挡则该光线为活状态,否则为死状态,初始化光线均为活状态;将该光线包从三维场景或像平面进入相机镜头;

4)顺序并逐个取出相机镜头中光学元件的结构信息,计算当前光线包中每一活状态光线经当前所取元件后的光线,得到更新后的光线包;

5)将通过相机镜头最后一光学元件后得到的光线包作为出射光线包;

6)光谱绘制模块利用5)所得出射光线包生成该相机的镜头色散效果。

2.如权利要求1所述的方法,其特征在于入射光瞳的位置及其孔径的计算方法为:

21)设点P0的初始化值为物平面中心、点Pmin的初始化值为相机镜头的前透镜中心、点Pmax初始化为前透镜边缘上一点;光线Rmin初始化为从点P0到点Pmin、光线Rmax初始化为从点P0到点Pmax,光线R1初始化为光线Rmax;

22)计算光线Rmin和Rmax的方向余弦,如果Rmin和Rmax方向余弦相差大于阈值H,则在镜头内正向或逆向追踪光线R1,如果光线R1能够通过相机镜头,则Rmin=R1,否则Rmax=R1;然后令R=(Rmin+Rmax)/2;

23)迭代计算步骤22),当如果Rmin和Rmax方向余弦相差小于等于阈值H或达到预先设定迭代次数T时,则执行步骤24);

24)将光线R作为入射光瞳的边缘光线,光线R能通过的最后一个光学元件为孔径光阑;

25)将点P1初始化为孔径光阑中心、点P2初始化为孔径光阑前一光学元件上的近轴点;

26)将光线R2初始化为从点P1到点P2,逆向或正向追踪光线R2,直到该光线离开相机镜头;

27)将光线R2通过镜头后与光轴的交点确定为入射光瞳的位置P,根据位置P和边缘光线R确定入射光瞳的孔径D。

3.如权利要求1所述的方法,其特征在于出射光瞳的位置及其孔径的计算方法为:

31)设点P0的初始化值为像平面中心、点Pmin的初始化值为相机镜头的后透镜中心、点Pmax初始化为后透镜边缘上一点;光线Rmin初始化为从点P0到点Pmin、光线Rmax初始化为从点P0到点Pmax,光线R1初始化为光线Rmax;

32)计算光线Rmin和Rmax的方向余弦,如果Rmin和Rmax方向余弦相差大于阈值H,则在镜头内正向或逆向追踪光线R1,如果光线R1能够通过相机镜头,则Rmin=R1,否则Rmax=R1;然后令R=(Rmin+Rmax)/2;

33)迭代计算步骤32),当如果Rmin和Rmax方向余弦相差小于等于阈值H或达到预先设定迭代次数T时,则执行步骤34);

34)将光线R作为出射光瞳的边缘光线,光线R能通过的最后一个光学元件为孔径光阑;

35)将点P1初始化为孔径光阑中心、点P2初始化为孔径光阑前一光学元件上的近轴点;

36)将光线R2初始化为从点P1到点P2,逆向或正向追踪光线R2,直到该光线离开相机镜头;

37)将光线R2通过镜头后与光轴的交点确定为出射光瞳的位置P,根据位置P和边缘光线R确定出射光瞳的孔径D。

4.如权利要求2或3所述的方法,其特征在于如果所述入射或出射光瞳不是圆形,则首先求出包含该非圆形光瞳的最小圆,然后以该最小圆替代入射或出射光瞳。

5.如权利要求1所述的方法,其特征在于所述出射光线包的计算方法为:

51)将光线包(R1...RK)从三维场景或像平面进入相机镜头;

52)根据光线包的方向顺序从相机镜头中取出一个光学元件表面Si;

53)遍历光线包中的每一条光线,计算光线包中活光线Rj与光学表面Si的交点Pj,

54)如果交点Pj在光学元件的孔径范围外,则将该光线标记为死光线,否则根据当前光学元件在交点Pj处的法线Nj计算光线Rj被光学元件折射或反射后的光线Tj,令Rj=Tj;

更新当前光线包并将其作为下一光学元件的输入;

55)将通过最后一光学元件后得到的光线包作为出射光线包。

说明书 :

一种镜头色散效果的生成方法

技术领域

[0001] 本发明属于计算机图形学领域,具体涉及一种具有照片级真实感的镜头色散效果模拟方法,该技术能够模拟由相机镜头折射材料所引起的色散效果。

背景技术

[0002] 镜头色散效果是一种与相机光学镜头相关的光学色散效果,该效果主要是由镜头材质的色散特性所引起。镜头材质(主要是玻璃、塑料、晶体等)的色散特性是指其折射率随波长的变化而变化。镜头材质的这种特性使得在镜头的成像结果中呈现出多彩的镜头效果,如彩色边缘、彩色的弥散圈等。模拟这些与镜头相关的色散效果能够改进计算机合成图像的真实感,或产生艺术级的特效,用于电影、游戏、动画等场合。
[0003] 此外,在光学本质上,模拟镜头色散效果实质是对镜头色差的可视化,因此模拟色散效果能够用于分析镜头的成像性能,优化镜头设计,以实现最佳的成像结果。现有的研究成果主要集中研究如何模拟普通玻璃的色散效果,采用了简单的针孔镜头模型或单透镜模型,以及递归式光线追踪技术。由于缺乏精确的光谱镜头模型,这类方法无法模拟镜头色散这类特殊的光学效果。同时递归式光线追踪技术也不适合与镜头模型进行集成,以绘制与镜头相关的光学效果。

发明内容

[0004] 针对现有方法不能模拟镜头色散效果的问题,本发明的目的在于提供一种镜头色散效果的生成方法。本发明以分布式光线追踪方法和精确的光谱镜头模型为基础生成图形,是一种基于几何光学理论的色散效果的生成方法。该方法以序列光线追踪方法建立精确的相机镜头模型,以模拟各种多彩的色散效果;并利用几何光学理论和序列光线追踪法精确计算出入(出)射光瞳的位置和大小,以提高光线追踪效率。
[0005] 本发明的技术方案为:
[0006] 一种镜头色散效果的生成方法,其步骤为:
[0007] 1)根据相机镜头中顺序存储的光学元件的结构信息,利用光线追踪方法计算入射或出射光瞳的位置及其孔径;
[0008] 2)将计算出的入射或出射光瞳作为一光学元件加入到该相机镜头中;
[0009] 3)输入一包含有K条不同波长光线的光线包(R1...RK),每一条光线具有一状态:活光线或死光线,如果一光线未被相机镜头的某一光学元件阻挡则该光线为活状态,否则为死状态,初始化光线均为活状态;将该光线包从三维场景或像平面进入相机镜头;
[0010] 4)顺序并逐个取出相机镜头中光学元件的结构信息,计算当前光线包中每一活状态光线经当前所取元件后的光线,得到更新后的光线包;
[0011] 5)将通过相机镜头最后一光学元件后得到的光线包作为出射光线包;
[0012] 6)光谱绘制模块利用5)所得出射光线包生成该相机的镜头色散效果。
[0013] 进一步的,所述包括光学元件的结构信息包括:半径、厚度、光谱折射率、孔径。
[0014] 进一步的,入射光瞳的位置及其孔径的计算方法为:
[0015] 1)设点P0的初始化值为物平面中心、点Pmin的初始化值为相机镜头的前透镜中心、点Pmax初始化为前透镜边缘上一点;光线Rmin初始化为从点P0到点Pmin、光线Rmax初始化为从点P0到点Pmax,光线R1初始化为光线Rmax;
[0016] 2)计算光线Rmin和Rmax的方向余弦,如果Rmin和Rmax方向余弦相差大于阈值H,则在镜头内正向或逆向追踪光线R1,如果光线R1能够通过相机镜头,则Rmin=R1,否则Rmax=R1;然后令R=(Rmin+Rmax)/2;
[0017] 3)迭代计算步骤2),当如果Rmin和Rmax方向余弦相差小于等于阈值H或达到预先设定迭代次数T时,则执行步骤4);
[0018] 4)将光线R作为入射光瞳的边缘光线,光线R能通过的最后一个光学元件为孔径光阑;
[0019] 5)将点P1初始化为孔径光阑中心、点P2初始化为孔径光阑前一光学元件上的近轴点;
[0020] 6)将光线R2初始化为从点P1到点P2,逆向或正向追踪光线R2,直到该光线离开相机镜头;
[0021] 7)将光线R2通过镜头后与光轴的交点确定为入射光瞳的位置P,根据位置P和边缘光线R确定入射光瞳的孔径D。
[0022] 进一步的,出射光瞳的位置及其孔径的计算方法为:
[0023] 1)设点P0的初始化值为像平面中心、点Pmin的初始化值为相机镜头的后透镜中心、点Pmax初始化为后透镜边缘上一点;光线Rmin初始化为从点P0到点Pmin、光线Rmax初始化为从点P0到点Pmax,光线R1初始化为光线Rmax;
[0024] 2)计算光线Rmin和Rmax的方向余弦,如果Rmin和Rmax方向余弦相差大于阈值H,则在镜头内正向或逆向追踪光线R1,如果光线R1能够通过相机镜头,则Rmin=R1,否则Rmax=R1;然后令R=(Rmin+Rmax)/2;
[0025] 3)迭代计算步骤2),当如果Rmin和Rmax方向余弦相差小于等于阈值H或达到预先设定迭代次数T时,则执行步骤4);
[0026] 4)将光线R作为出射光瞳的边缘光线,光线R能通过的最后一个光学元件为孔径光阑;
[0027] 5)将点P1初始化为孔径光阑中心、点P2初始化为孔径光阑前一光学元件上的近轴点;
[0028] 6)将光线R2初始化为从点P1到点P2,逆向或正向追踪光线R2,直到该光线离开相机镜头;
[0029] 7)将光线R2通过镜头后与光轴的交点确定为出射光瞳的位置P,根据位置P和边缘光线R确定出射光瞳的孔径D。
[0030] 进一步的,如果所述入射或出射光瞳不是圆形,则首先求出包含该非圆形光瞳的最小圆,然后以该最小圆替代入射或出射光瞳。
[0031] 进一步的,所述出射光线包的计算方法为:
[0032] 1)将光线包(R1...RK)从三维场景或像平面进入相机镜头;
[0033] 2)根据光线包的方向顺序从相机镜头中取出一个光学元件表面Si;
[0034] 3)遍历光线包中的每一条光线,计算光线包中活光线Rj与光学表面Si的交点Pj,[0035] 4)如果交点Pj在光学元件的孔径范围外,则将该光线标记为死光线,否则根据当前光学元件在交点Pj处的法线Nj计算光线Rj被光学元件折射或反射后的光线Tj,令Rj=Tj;更新当前光线包并将其作为下一光学元件的输入;
[0036] 5)将通过最后一光学元件后得到的光线包作为出射光线包。
[0037] 与现有技术相比,本发明的积极效果为:
[0038] 与过去的色散效果绘制方法相比,本发明有如下优点:1)基于精确的光谱镜头模型,而不是理想模型(比如针孔相机模型或透视相机模型),因此绘制结果更加真实和准确;2)基于序列光谱光线追踪方法,易于集成到任何支持光谱光线追踪方法的渲染器中,在渲染复杂场景时,与场景中光线追踪所耗费的时间相比,相机镜头中光线追踪所耗费的时间几乎可以忽略,且基于出射光瞳的光线采样算法进一步地减少了相机镜头中光线追踪所耗费的时间;3)能够模拟任何相机镜头的色散效果。

附图说明

[0039] 图1为本发明方法的主流程图;
[0040] 图2为算法2的子流程图。

具体实施方式

[0041] 下面结合附图,对本发明的实施方式进行进一步的详细描述。
[0042] 本发明的方法流程如图1所示:
[0043] (1)入(出)射光瞳的计算
[0044] 在进行相机镜头内的光线追踪时,最直接的光线采样方法是在聚焦平面(像平面)和前透镜(后透镜)之间进行。然而采用这种光线采样方法的光线追踪效率很低,这是因为通过前(后)透镜的许多光线都被相机镜头内部的光阑阻挡掉,而不能穿过整个镜头。
[0045] 从光学成像理论可以得出,孔径光阑、出射光瞳和入射光瞳存在共轭关系,也就是说,从一物点发出的光线,如果通过入射光瞳,就必然通过孔径光阑和出射光瞳,同时通过整个相机镜头;如果光线不能通过入射光瞳,则其同样不能通过孔径光阑和出射光瞳。因此在聚焦(像)平面和入(出)射光瞳之间采样光线可以大大提高光线追踪的效率,在孔径光阑直径相对较小时尤其如此,这一点可以在后面所进行的光线追踪效率实验中得到验证。
[0046] 入(出)射光瞳是孔径光阑在物(像)方空间的像,实际中是不存在的,因此在利用入(出)射光瞳进行光线采样之前,首先需要计算入(出)射光瞳的位置(在光轴上)和孔径(半径或直径)。本文提出的用于计算入(出)射光瞳的算法首先利用光线追踪方法精确地计算出入(出)射光瞳的位置,然后利用高斯光学理论和光线追踪方法确定入(出)射光瞳的直径,详细的算法过程如下:
[0047] 算法1.计算入(出)射光瞳的位置和大小
[0048] 输入:存储相机镜头所有光学元件的数据结构(包括光学元件的半径、厚度、光谱折射率、孔径)
[0049] 输出:入(出)射光瞳的位置和大小
[0050] Step 1.点P0初始化为物(像)平面中心,点Pmin初始化为前(后)透镜中心,点Pmax初始化为前(后)透镜边缘上一点;
[0051] Step 2.光线Rmin初始化为从点P0到点Pmin,光线Rmax初始化为从点P0到点Pmax,光线R1初始化为光线Rmax;
[0052] Step 3.如果光线Rmin和Rmax的方向余弦相差大于某最小值H且迭代次数不超过预先设定的最大值T时,则执行下一步,否则转Step 5;
[0053] Step 4.在镜头内正(逆)向追踪光线R1,如果光线R1能够通过相机镜头,则Rmin=R1,否则Rmax=R1。然后R=(Rmin+Rmax)/2,返回Step 3;
[0054] Step 5.光线R即为入(出)射光瞳的边缘光线,光线R能通过的最后一个光学元件即为孔径光阑;
[0055] Step 6.点P1初始化为孔径光阑中心,点P2初始化为位于孔径光阑前(后)面的光学元件上的近轴点;
[0056] Step 7.光线R2初始化为从点P1到点P2,逆(正)向追踪光线R2,直到该光线离开相机镜头;
[0057] Step 8.入(出)射光瞳的位置P即为由光线R2通过镜头后与光轴的交点,入(出)射光瞳的孔径D由入(出)射光瞳的位置P和边缘光线R确定,即由光线R2通过镜头后与光轴的交点确定入(出)射光瞳的位置P,以及由入(出)射光瞳的位置P和边缘光线R确定出出射光瞳的孔径D,算法结束。
[0058] 需要注意的是,如果孔径光阑不是圆形的,则首先求出包含该非圆形孔径光阑的最小圆,以该最小圆替代孔径光阑,以求得入(出)射光瞳。求出的入(出)射光瞳只用于光线采样,而在进行相机镜头内的序列光线追踪时,将使用实际的孔径光阑形状。
[0059] (2)相机镜头内的序列光谱光线追踪
[0060] 相机镜头的光学元件能够按光路的顺序存储起来,镜头内的光线追踪能够逐个元件进行。与普通的光线追踪方法不同,在镜头内进行光线追踪时,不需要寻找光线的最近交点,避免了大量的排序和相交测试计算,因此序列光线追踪方法效率较高,且与通用的光线追踪绘制程序集成时,既可以建立精确的相机镜头模型,又不会明显降低渲染程序的性能。渲染一个复杂的三维场景时,三维场景中的光线追踪计算占用绝大部分的计算时间,而镜头内的序列光线追踪所占时间几乎可以忽略。序列光线追踪方法的基本思路是,首先将相机镜头的所有光学元件存储到一个数据结构中,顺序并逐个取出该镜头的光学元件,接着利用该光学元件的相关信息,计算光线与该元件的交点、以及被该元件折射的光线方向,最后能够通过相机镜头的光线被通用的光线追踪绘制程序使用,以进行三维场景中的光线追踪(即光线追踪绘制模块利用能够通过相机镜头的光线生成图像的色散效果),光线追踪绘制模块处理本发明输入的光线时计算速度会得到很大提高。详细的算法过程如下:
[0061] 算法2.镜头内的双向序列光谱光线追踪算法,如图2所示;
[0062] 输入:存储相机镜头所有光学元件的数据结构(包括光学元件的半径、厚度、折射材质、孔径)
[0063] 输出:从相机镜头前面或后面射出的光线
[0064] Step 1.对于一个输入的光线包(R1...RK),其中含有K条不同波长的光线,光线包从三维场景进入相机镜头或从像平面进入镜头。光线包中的每一条光线都具有一个状态:活光线或死光线,以表示该光线是否已被相机镜头的某一部件阻挡。在初始化阶段,所有光线均为活状态;
[0065] Step 2.根据光线包的方向从相机镜头中取出一个光学元件表面Si。如果Si存在,继续执行下一步,否则执行Step 6;
[0066] Step 3.遍历光线包中的每一条光线。如果有活光线Rj,继续执行下一步,否则算法结束。当遍历结束后,返回Step 2;
[0067] Step 4.计算光线Rj和光学表面Si的交点Pj。如果交点Pj在光学元件的孔径范围外,光线Rj不能通过该光学元件,标记为死光线,否则光线Rj能通过该光学元件,继续执行下一步;
[0068] Step 5.计算该光学元件在交点Pj处的法线Nj,然后利用法线Nj计算光线Rj被光学元件折射或反射后的光线Tj,Rj=Tj,返回Step 3;
[0069] Step 6.R1...Rk即为离开相机镜头的光线包,算法结束。
[0070] (3)最后光谱绘制模块利用能够通过相机镜头的光线(即出射光线包),生成镜头色散效果。
[0071] 结合算法2和光谱绘制模块进行从相机到三维场景的光线跟踪,以生成镜头色散效果图像。