一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法

著录项
  • CN201010608616.9
  • 20101228
  • CN102074038A
  • 20110525
  • 长春理工大学
  • 陈纯毅;杨华民;蒋振刚;范静涛;丁莹;冯欣;底晓强;韩成;陈占芳;李奇
  • G06T15/50(2006.01)I
  • G06T15/50(2006.01)I

  • 吉林省长春市卫星路7089号
  • 中国,CN,吉林(22)
摘要
本发明公开一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法,属于真实感3D虚拟场景绘制技术领域。当前,常用光子映射算法绘制3D虚拟场景的面焦散效果。光子映射算法要求对光源发射的大量光子进行跟踪计算,这会严重降低3D虚拟场景面焦散效果的绘制效率。本发明首先创建由光滑表面折射产生的3D虚拟场景中的所有焦散照明体,并将其存入相应的数据结构之中;在绘制3D虚拟场景时,通过计算待绘制场景点与焦散照明体之间的位置关系来判断是否需要在该待绘制场景点的光照值中加入此焦散照明体的贡献,最终实现对面焦散效果的绘制。本发明方法可以很容易地集成到光线跟踪算法框架之中,能显著地提高3D虚拟场景绘制的真实感。
权利要求

1.一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法,其特征在于,所需的数据结构及实现步骤如下:

所需的数据结构:本发明提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散照明体的数据结构(100),其包括光滑透明三角形面片的顶点位置P 1、顶点位置P 2、顶点位置P 3、顶点法向量N 1、顶点法向量N 2、顶点法向量N 3、折射标识F 1、折射标识F 2、折射标识F 3、折射光线方向向量R 1、折射光线方向向量R 2、折射光线方向向量R 3、相交标识T 1、相交标识T 2、相交标识T 3、交点S 1、交点S 2、交点S 3、二次折射标识G 1、二次折射标识G 2、二次折射标识G 3、二次折射光线方向向量RS 1、二次折射光线方向向量RS 2、二次折射光线方向向量RS 3等18个成员变量;

实现步骤:

本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所有焦散照明体,具体步骤如下:

步骤(S011):将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存入三角形面片列表1(A002)中;将3D虚拟场景(A002)中所有背向光源的光滑透明三角形面片存入三角形面片列表2(A003)中;对三角形面片列表1(A002)中的每个三角形面片(A004),创建一个数据结构(100)类型的变量(A005),并将变量(A005)与三角形面片(A004)相关联;

步骤(S012):将三角形面片列表1(A002)中所有三角形面片的顶点存入顶点列表1(A006)中,并且删除重复的顶点;对顶点列表1(A006)中的每个顶点(A007),创建一个从顶点(A007)指向光源位置的向量(A008),如果顶点(A007)的法向量与向量(A008)的夹角大于90度,则将顶点(A007)从顶点列表1(A006)中删除;

步骤(S013):对顶点列表1(A006)中的每个顶点(A009),做如下计算:

(S013-1):根据顶点(A009)的位置及法向量、光源位置、顶点(A009)对应的光滑透明三角形面片的折射率,判断从光源入射的光线在顶点(A009)位置处是否能发生折射,如果能发生折射,则计算顶点(A009)位置处的折射光线方向向量(A010)并置Flag0=1,否则置Flag0=0并转步骤(S014);

(S013-2):根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射线(A011),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片(A012)与折射光线射线(A011)相交,如果没有,则置Flag1=0并转步骤(S014),否则置Flag1=1,并计算出离顶点(A009)最近的交点(A013),将交点(A013)位置处的三角形面片(A014)与顶点(A009)相关联,再根据折射定律判断在交点(A013)位置处能否发生折射,如果发生折射则置Flag2=1并计算折射光线方向向量(A015),否则置Flag2=0并转步骤(S014);

(S013-3):在三角形面片列表1(A002)中,出包含顶点(A009)的所有三角形面片(A016),计算顶点(A009)在各三角形面片(A016)的顶点序列中的编号i(i=1,2,3);将顶点(A009)的位置及法向量分别赋值给与各三角形面片(A016)相关联的变量(A005)的顶点位置P i及顶点法向量N i成员变量;将Flag0赋值给与各三角形面片(A016)相关联的变量(A005)的折射标识F i成员变量;将折射光线方向向量(A010)赋值给与各三角形面片(A016)相关联的变量(A005)的折射光线方向向量R i成员变量;将Flag1赋值给与各三角 形面片(A016)相关联的变量(A005)的相交标识T i成员变量;将交点(A013)赋值给与各三角形面片(A016)相关联的变量(A005)的交点S i成员变量;将Flag2赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射标识G i成员变量;将折射光线方向向量(A015)赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射光线方向向量RS i成员变量;

步骤(S014):对于三角形面片列表1(A002)中的每个三角形面片(A017),做如下计算:

(S014-1):如果与三角形面片(A017)相关联的变量(A005)的第i个折射标识F i成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

(S014-2):如果与三角形面片(A017)相关联的变量(A005)的第i个二次折射标识G i成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

步骤(S015):将三角形面片列表1(A002)中的各个三角形面片(A018)所关联的变量(A005)存入一个列表(A019)中,列表(A019)定义了由光滑表面折射产生的3D虚拟场景中的所有焦散照明体;

本发明的方法(020)部分实现待绘制场景点(B001)的焦散光照值的计算,具体步骤如下:

步骤(S021):创建一个包含待绘制场景点(B001)的平面(B002),且平面(B002)的法向量平行于待绘制场景点(B001)的法向量;

步骤(S022):对于列表(A019)中的每个元素(B003),做如下计算:

(S022-1):如果元素(B003)的相交标识T 1、相交标识T 2、相交标识T 3等三个成员变量都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P 1成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R 1成员变量表示的方向的射线(B004),创建一条起始于元素(B003)的顶点位置P 2成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R 2成员变量表示的方向的射线(B005),创建一条起始于元素(B003)的顶点位置P 3成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R 3成员变量表示的方向的射线(B006);

(S022-2):计算射线(B004)与平面(B002)的交点(B007);计算射线(B005)与平面(B002)的交点(B008);计算射线(B006)与平面(B002)的交点(B009);如果待绘制场景点(B001)处于由交点(B007)、交点(B008)和交点(B009)确定的三角形之外或者待绘制场景点(B001)不在由交点(B007)、交点(B008)和交点(B009)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B007)、交点(B008)和交点(B009)的距离以及元素(B003)的折射光线方向向量R 1、折射光线方向向量R 2、折射光线方向向量R 3等三个成员变量,通过插值计算出待绘制场景点(B001)处的折射光线方向向量(B010);

(S022-3):创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量(B010)的反向向量的射线(B011);计算射线(B011)与由元素(B003)的顶点位置P 1、顶点位置P 2、顶点位置P 3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013); 创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-4):如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016),则计算三角形(B016)在三角形面片(B012)所在平面上的投影面积(B017),再计算投影面积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α;如果交点(B007)、交点(B008)和交点(B009)构成一条直线段,则将变量α设置为一个固定值;创建从交点(B013)指向光源位置的向量(B019),对向量(B019)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值给变量I(B022);根据变量I(B022)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-5):创建一条起始于元素(B003)的交点S 1成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS 1成员变量表示的方向的射线(B023);创建一条起始于元素(B003)的交点S 2成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS 2成员变量表示的方向的射线(B024);创建一条起始于元素(B003)的交点S 3成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS 3成员变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算射线(B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028);如果待绘制场景点(B001)处于由交点(B026)、交点(B027)和交点(B028)确定的三角形之外或者待绘制场景点(B001)不在由交点(B026)、交点(B027)和交点(B028)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B026)、交点(B027)和交点(B028)的距离以及元素(B003)的二次折射光线方向向量RS 1、二次折射光线方向向量RS 2、二次折射光线方向向量RS 3等三个成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量(B029);

(S022-6):创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向向量(B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S 1、交点S 2、交点S 3等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元素(B003)的交点S 1、交点S 2、交点S 3等三个成员变量表示的交点的距离以及元素(B003)的折射光线方向向量R 1、折射光线方向向量R 2、折射光线方向向量R 3等三个成员变量,通过插值计算出交点(B031)处的折射光线方向向量(B032);

(S022-7):创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的反向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P 1、顶点位置P 2、顶点位置P 3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B034);创建一条 起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-8):如果交点(B026)、交点(B027)和交点(B028)构成一个三角形(B036),则计算三角形(B036)在由元素(B003)的交点S 1、交点S 2、交点S 3等三个成员变量表示的交点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片(B012)的面积之比(B039),将面积之比(B039)赋值给变量β;如果交点(B026)、交点(B027)和交点(B028)构成一条直线段,则将变量β设置为一个固定值;创建从交点(B034)指向光源位置的向量(B040),对向量(B040)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B041),将照明度(B041)乘以变量β并赋值给变量J(B042);根据变量J(B042)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。

说明书
技术领域

技术领域

本发明属于真实感3D虚拟场景绘制技术领域,涉及一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法。

背景技术

真实感3D虚拟场景绘制技术在数字娱乐、影视特效、建筑CAD、广告动画等领域受到人们的广泛关注。目前3D虚拟场景绘制技术虽然已经得到深入的研究,但是如何快速绘制具有高度真实感的3D虚拟场景画面仍然是一个有待进一步解决的难题。当光源发出的光线入射到光滑透明表面上时,光滑透明表面的折射过程可能对折射光线产生聚焦或者离焦作用,从而导致折射光线形成复杂的空间分布。当这些空间分布复杂的折射光线再次入射到不透明的反射表面上时,就会在反射表面上产生形状复杂的亮斑,这就是由光滑表面折射产生的面焦散。

光子映射是一种绘制面焦散效果的经典方法。标准的光子映射算法首先对大量的从光源发射的光子进行跟踪,将这些光子与场景表面的碰撞位置及其相关数据记录在光子缓存中;然后根据光子缓存中的数据计算场景的焦散图;最后利用类似阴影映射的方法把焦散图投影到场景表面上,从而绘制出面焦散效果。由于大量的光子跟踪计算存在较大的系统执行时间和存储空间开销,因此利用光子映射算法绘制面焦散效果的效率通常不高。

随着3D虚拟场景绘制技术的不断发展,影视特效、游戏、视景仿真等3D应用对绘制画面的真实感要求变得越来越高。在这些3D应用中加入由光滑表面折射产生的3D虚拟场景的面焦散效果可显著增强绘制画面的真实感。目前人们迫切需要在不明显降低绘制效率的条件下,将面焦散效果加入到3D虚拟场景的绘制之中。因此设计快速绘制由光滑表面折射产生的3D虚拟场景的面焦散效果的方法具有重要的意义。值得注意的是,在大多数3D虚拟场景中,仅绘制由一次或者二次折射产生的面焦散效果就可以获得很好的真实感。例如,对于水底场景,通常只需考虑水面对光线的一次折射即可,然而当光线透过玻璃球照射到桌面上时,则需考虑由二次折射产生的面焦散效果。换句话说,3D虚拟场景中的不封闭的透明折射面会形成一次折射产生的面焦散效果,而封闭的透明折射体则形成二次折射产生的面焦散效果。充分利用这一特点,可以设计出不需光子跟踪的算法来绘制由光滑表面折射产生的面焦散效果。

发明内容

本发明的目的在于提供一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法。如图1所示,本方法首先创建由光滑表面折射产生的3D虚拟场景中的所有焦散照明体,然后对每个焦散照明体,判断待绘制场景点是否处于此焦散照明体之中,如果待绘制场景点处于其中且待绘制场景点所在的焦散照明体位置不受光源遮挡影响,则计算此焦散照明体对待绘制场景点的光照贡献,并将其加到待绘制场景点的总光照值之中,否则此焦 散照明体对待绘制场景点的光照贡献为0。

本发明首先提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散照明体的数据结构(100),如图2所示,其包括光滑透明三角形面片的顶点位置P1、顶点位置P2、顶点位置P3、顶点法向量N1、顶点法向量N2、顶点法向量N3、折射标识F1、折射标识F2、折射标识F3、折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3、相交标识T1、相交标识T2、相交标识T3、交点S1、交点S2、交点S3、二次折射标识G1、二次折射标识G2、二次折射标识G3、二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3等18个成员变量。

本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所有焦散照明体,具体步骤如下:

步骤(S011):将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存入三角形面片列表1(A002)中;将3D虚拟场景(A002)中所有背向光源的光滑透明三角形面片存入三角形面片列表2(A003)中;对三角形面片列表1(A002)中的每个三角形面片(A004),创建一个数据结构(100)类型的变量(A005),并将变量(A005)与三角形面片(A004)相关联;

步骤(S012):将三角形面片列表1(A002)中所有三角形面片的顶点存入顶点列表1(A006)中,并且删除重复的顶点;对顶点列表1(A006)中的每个顶点(A007),创建一个从顶点(A007)指向光源位置的向量(A008),如果顶点(A007)的法向量与向量(A008)的夹角大于90度,则将顶点(A007)从顶点列表1(A006)中删除;

步骤(S013):对顶点列表1(A006)中的每个顶点(A009),做如下计算:

(S013-1):根据顶点(A009)的位置及法向量、光源位置、顶点(A009)对应的光滑透明三角形面片的折射率,判断从光源入射的光线在顶点(A009)位置处是否能发生折射,如果能发生折射,则计算顶点(A009)位置处的折射光线方向向量(A010)并置Flag0=1,否则置Flag0=0并转步骤(S014);

(S013-2):根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射线(A011),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片(A012)与折射光线射线(A011)相交,如果没有,则置Flag1=0并转步骤(S014),否则置Flag1=1,并计算出离顶点(A009)最近的交点(A013),将交点(A013)位置处的三角形面片(A014)与顶点(A009)相关联,再根据折射定律判断在交点(A013)位置处能否发生折射,如果发生折射则置Flag2=1并计算折射光线方向向量(A015),否则置Flag2=0并转步骤(S014);

(S013-3):在三角形面片列表1(A002)中,出包含顶点(A009)的所有三角形面片(A016),计算顶点(A009)在各三角形面片(A016)的顶点序列中的编号i(i=1,2,3);将顶点(A009)的位置及法向量分别赋值给与各三角形面片(A016)相关联的变量(A005)的顶点位置Pi及顶点法向量Ni成员变量;将Flag0赋值给与各三角形面片(A016)相关联的变量(A005)的折射标识Fi成员变量;将折射光线方向向量(A010)赋值给与各三角形面片(A016)相关联的变量(A005)的折射光线方向向量Ri成员变量;将Flag1赋值给与各三角形面片(A016)相关联的变量(A005)的相交标识Ti成员变量;将交点(A013)赋值给与各三角形面片(A016)相关联的变量(A005)的交点Si成员变量;将Flag2赋值给与各三角形面 片(A016)相关联的变量(A005)的二次折射标识Gi成员变量;将折射光线方向向量(A015)赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射光线方向向量RSi成员变量;

步骤(S014):对于三角形面片列表1(A002)中的每个三角形面片(A017),做如下计算:

(S014-1):如果与三角形面片(A017)相关联的变量(A005)的第i个折射标识Fi成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

(S014-2):如果与三角形面片(A017)相关联的变量(A005)的第i个二次折射标识Gi成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

步骤(S015):将三角形面片列表1(A002)中的各个三角形面片(A018)所关联的变量(A005)存入一个列表(A019)中,列表(A019)定义了由光滑表面折射产生的3D虚拟场景中的所有焦散照明体。

本发明的方法(020)部分实现待绘制场景点(B001)的焦散光照值的计算,具体步骤如下:

步骤(S021):创建一个包含待绘制场景点(B001)的平面(B002),且平面(B002)的法向量平行于待绘制场景点(B001)的法向量;

步骤(S022):对于列表(A019)中的每个元素(B003),做如下计算:

(S022-1):如果元素(B003)的相交标识T1、相交标识T2、相交标识T3等三个成员变量都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P1成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R1成员变量表示的方向的射线(B004),创建一条起始于元素(B003)的顶点位置P2成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R2成员变量表示的方向的射线(B005),创建一条起始于元素(B003)的顶点位置P3成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R3成员变量表示的方向的射线(B006);

(S022-2):计算射线(B004)与平面(B002)的交点(B007);计算射线(B005)与平面(B002)的交点(B008);计算射线(B006)与平面(B002)的交点(B009);如果待绘制场景点(B001)处于由交点(B007)、交点(B008)和交点(B009)确定的三角形之外或者待绘制场景点(B001)不在由交点(B007)、交点(B008)和交点(B009)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B007)、交点(B008)和交点(B009)的距离以及元素(B003)的折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3等三个成员变量,通过插值计算出待绘制场景点(B001)处的折射光线方向向量(B010);

(S022-3):创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量(B010)的反向向量的射线(B011);计算射线(B011)与由元素(B003)的顶点位置P1、顶点位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013);创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角 形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-4):如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016),则计算三角形(B016)在三角形面片(B012)所在平面上的投影面积(B017),再计算投影面积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α;如果交点(B007)、交点(B008)和交点(B009)构成一条直线段,则将变量α设置为一个固定值;创建从交点(B013)指向光源位置的向量(B019),对向量(B019)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值给变量I(B022);根据变量I(B022)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-5):创建一条起始于元素(B003)的交点S1成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS1成员变量表示的方向的射线(B023);创建一条起始于元素(B003)的交点S2成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS2成员变量表示的方向的射线(B024);创建一条起始于元素(B003)的交点S3成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS3成员变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算射线(B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028);如果待绘制场景点(B001)处于由交点(B026)、交点(B027)和交点(B028)确定的三角形之外或者待绘制场景点(B001)不在由交点(B026)、交点(B027)和交点(B028)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B026)、交点(B027)和交点(B028)的距离以及元素(B003)的二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3等三个成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量(B029);

(S022-6):创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向向量(B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点的距离以及元素(B003)的折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3等三个成员变量,通过插值计算出交点(B031)处的折射光线方向向量(B032);

(S022-7):创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的反向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P1、顶点位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B034);创建一条起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不 透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-8):如果交点(B026)、交点(B027)和交点(B028)构成一个三角形(B036),则计算三角形(B036)在由元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片(B012)的面积之比(B039),将面积之比(B039)赋值给变量β;如果交点(B026)、交点(B027)和交点(B028)构成一条直线段,则将变量β设置为一个固定值;创建从交点(B034)指向光源位置的向量(B040),对向量(B040)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B041),将照明度(B041)乘以变量β并赋值给变量J(B042);根据变量J(B042)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。

有益效果

本发明提供了一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法。本发明方法与光子映射方法相比,避免了对大量的从光源发射的光子的跟踪运算,提高了面焦散效果的绘制效率。另外,本发明方法能够很容易地集成到光线跟踪等全局光照绘制算法框架之中,可显著地提高3D虚拟场景画面绘制的真实感。

附图说明

图1是由光滑表面折射产生的3D虚拟场景面焦散效果绘制流程;图2是光滑表面折射产生的焦散照明体的数据结构。

具体实施方式

为了使本发明的特征和优点更加清楚明白,下面参照附图结合具体实施例对本发明作进一步的描述。

在本实施例中,使用光线跟踪算法绘制3D虚拟场景。由于光线跟踪算法只对镜面反射光线或者折射光线进行递归跟踪,因此无法绘制出漫反射表面上的面焦散效果。为此,针对光滑表面折射产生的3D虚拟场景面焦散效果的绘制问题,需要在场景点的光照值计算中增加一个新过程,以便获得场景点的焦散光照值。计算出所有待绘制场景点的焦散光照值,就实现了对3D虚拟场景面焦散效果的绘制。将焦散光照值加到标准光线跟踪算法计算出的场景点光照值之中,可进一步地把面焦散效果合成到最终的3D虚拟场景绘制结果之中。下面将讲述这个新增加过程的具体实施方式。

本发明首先提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散照明体的数据结构(100),如图2所示,其包括光滑透明三角形面片的顶点位置P1、顶点位置P2、顶点 位置P3、顶点法向量N1、顶点法向量N2、顶点法向量N3、折射标识F1、折射标识F2、折射标识F3、折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3、相交标识T1、相交标识T2、相交标识T3、交点S1、交点S2、交点S3、二次折射标识G1、二次折射标识G2、二次折射标识G3、二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3等18个成员变量。

本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所有焦散照明体,具体步骤如下:

步骤(S011):将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存入三角形面片列表1(A002)中;将3D虚拟场景(A002)中所有背向光源的光滑透明三角形面片存入三角形面片列表2(A003)中;对三角形面片列表1(A002)中的每个三角形面片(A004),创建一个数据结构(100)类型的变量(A005),并将变量(A005)与三角形面片(A004)相关联;

步骤(S012):将三角形面片列表1(A002)中所有三角形面片的顶点存入顶点列表1(A006)中,并且删除重复的顶点;对顶点列表1(A006)中的每个顶点(A007),创建一个从顶点(A007)指向光源位置的向量(A008),如果顶点(A007)的法向量与向量(A008)的夹角大于90度,则将顶点(A007)从顶点列表1(A006)中删除;

步骤(S013):对顶点列表1(A006)中的每个顶点(A009),做如下计算:

(S013-1):根据顶点(A009)的位置及法向量、光源位置、顶点(A009)对应的光滑透明三角形面片的折射率,判断从光源入射的光线在顶点(A009)位置处是否能发生折射,如果能发生折射,则计算顶点(A009)位置处的折射光线方向向量(A010)并置Flag0=1,否则置Flag0=0并转步骤(S014);

(S013-2):根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射线(A011),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片(A012)与折射光线射线(A011)相交,如果没有,则置Flag1=0并转步骤(S014),否则置Flag1=1,并计算出离顶点(A009)最近的交点(A013),将交点(A013)位置处的三角形面片(A014)与顶点(A009)相关联,再根据折射定律判断在交点(A013)位置处能否发生折射,如果发生折射则置Flag2=1并计算折射光线方向向量(A015),否则置Flag2=0并转步骤(S014);

(S013-3):在三角形面片列表1(A002)中,出包含顶点(A009)的所有三角形面片(A016),计算顶点(A009)在各三角形面片(A016)的顶点序列中的编号i(i=1,2,3);将顶点(A009)的位置及法向量分别赋值给与各三角形面片(A016)相关联的变量(A005)的顶点位置Pi及顶点法向量Ni成员变量;将Flag0赋值给与各三角形面片(A016)相关联的变量(A005)的折射标识Fi成员变量;将折射光线方向向量(A010)赋值给与各三角形面片(A016)相关联的变量(A005)的折射光线方向向量Ri成员变量;将Flag1赋值给与各三角形面片(A016)相关联的变量(A005)的相交标识Ti成员变量;将交点(A013)赋值给与各三角形面片(A016)相关联的变量(A005)的交点Si成员变量;将Flag2赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射标识Gi成员变量;将折射光线方向向量(A015)赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射光线方向向量RSi成员变量;

步骤(S014):对于三角形面片列表1(A002)中的每个三角形面片(A017),做如下计算:

(S014-1):如果与三角形面片(A017)相关联的变量(A005)的第i个折射标识Fi成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

(S014-2):如果与三角形面片(A017)相关联的变量(A005)的第i个二次折射标识Gi成员变量的值为0(i=1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删除,否则转步骤(S015);

步骤(S015):将三角形面片列表1(A002)中的各个三角形面片(A018)所关联的变量(A005)存入一个列表(A019)中,列表(A019)定义了由光滑表面折射产生的3D虚拟场景中的所有焦散照明体。

本发明的方法(020)部分实现待绘制场景点(B001)的焦散光照值的计算,具体步骤如下:

步骤(S021):创建一个包含待绘制场景点(B001)的平面(B002),且平面(B002)的法向量平行于待绘制场景点(B001)的法向量;

步骤(S022):对于列表(A019)中的每个元素(B003),做如下计算:

(S022-1):如果元素(B003)的相交标识T1、相交标识T2、相交标识T3等三个成员变量都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P1成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R1成员变量表示的方向的射线(B004),创建一条起始于元素(B003)的顶点位置P2成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R2成员变量表示的方向的射线(B005),创建一条起始于元素(B003)的顶点位置P3成员变量表示的顶点,方向平行于元素(B003)的折射光线方向向量R3成员变量表示的方向的射线(B006);

(S022-2):计算射线(B004)与平面(B002)的交点(B007);计算射线(B005)与平面(B002)的交点(B008);计算射线(B006)与平面(B002)的交点(B009);如果待绘制场景点(B001)处于由交点(B007)、交点(B008)和交点(B009)确定的三角形之外或者待绘制场景点(B001)不在由交点(B007)、交点(B008)和交点(B009)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B007)、交点(B008)和交点(B009)的距离以及元素(B003)的折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3等三个成员变量,通过插值计算出待绘制场景点(B001)处的折射光线方向向量(B010);

(S022-3):创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量(B010)的反向向量的射线(B011);计算射线(B011)与由元素(B003)的顶点位置P1、顶点位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013);创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-4):如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016), 则计算三角形(B016)在三角形面片(B012)所在平面上的投影面积(B017),再计算投影面积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α;如果交点(B007)、交点(B008)和交点(B009)构成一条直线段,则将变量α设置为一个固定值;创建从交点(B013)指向光源位置的向量(B019),对向量(B019)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值给变量I(B022);根据变量I(B022)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-5):创建一条起始于元素(B003)的交点S1成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS1成员变量表示的方向的射线(B023);创建一条起始于元素(B003)的交点S2成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS2成员变量表示的方向的射线(B024);创建一条起始于元素(B003)的交点S3成员变量表示的交点位置,方向平行于元素(B003)的二次折射光线方向向量RS3成员变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算射线(B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028);如果待绘制场景点(B001)处于由交点(B026)、交点(B027)和交点(B028)确定的三角形之外或者待绘制场景点(B001)不在由交点(B026)、交点(B027)和交点(B028)确定的直线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根据待绘制场景点(B001)到交点(B026)、交点(B027)和交点(B028)的距离以及元素(B003)的二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3等三个成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量(B029);

(S022-6):创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向向量(B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点的距离以及元素(B003)的折射光线方向向量R1、折射光线方向向量R2、折射光线方向向量R3等三个成员变量,通过插值计算出交点(B031)处的折射光线方向向量(B032);

(S022-7):创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的反向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P1、顶点位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B034);创建一条起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片(B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;

(S022-8):如果交点(B026)、交点(B027)和交点(B028)构成一个三角形(B036), 则计算三角形(B036)在由元素(B003)的交点S1、交点S2、交点S3等三个成员变量表示的交点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片(B012)的面积之比(B039),将面积之比(B039)赋值给变量β;如果交点(B026)、交点(B027)和交点(B028)构成一条直线段,则将变量β设置为一个固定值;创建从交点(B034)指向光源位置的向量(B040),对向量(B040)进行归一化计算;根据三角形面片(B012)的三个顶点位置,计算三角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B041),将照明度(B041)乘以变量β并赋值给变量J(B042);根据变量J(B042)的值、待绘制场景点(B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。

本文发布于:2024-09-24 13:11:40,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/73346.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议