专利名称:一种由光滑表面折射产生的3d虚拟场景面焦散效果的绘制方法
技术领域:
本发明属于真实感3D虚拟场景绘制技术领域,涉及一种由光滑表面折射产生的 3D虚拟场景面焦散效果的绘制方法。
背景技术:
真实感3D虚拟场景绘制技术在数字娱乐、影视特效、建筑CAD、广告动画等领域受 到人们的广泛关注。目前3D虚拟场景绘制技术虽然已经得到深入的研究,但是如何快速绘 制具有高度真实感的3D虚拟场景画面仍然是一个有待进一步解决的难题。当光源发出的 光线入射到光滑透明表面上时,光滑透明表面的折射过程可能对折射光线产生聚焦或者离 焦作用,从而导致折射光线形成复杂的空间分布。当这些空间分布复杂的折射光线再次入 射到不透明的反射表面上时,就会在反射表面上产生形状复杂的亮斑,这就是由光滑表面 折射产生的面焦散。光子映射是一种绘制面焦散效果的经典方法。标准的光子映射算法首先对大量的 从光源发射的光子进行跟踪,将这些光子与场景表面的碰撞位置及其相关数据记录在光子 缓存中;然后根据光子缓存中的数据计算场景的焦散图;最后利用类似阴影映射的方法把 焦散图投影到场景表面上,从而绘制出面焦散效果。由于大量的光子跟踪计算存在较大的 系统执行时间和存储空间开销,因此利用光子映射算法绘制面焦散效果的效率通常不高。随着3D虚拟场景绘制技术的不断发展,影视特效、游戏、视景仿真等3D应用对绘 制画面的真实感要求变得越来越高。在这些3D应用中加入由光滑表面折射产生的3D虚拟 场景的面焦散效果可显著增强绘制画面的真实感。目前人们迫切需要在不明显降低绘制效 率的条件下,将面焦散效果加入到3D虚拟场景的绘制之中。因此设计快速绘制由光滑表面 折射产生的3D虚拟场景的面焦散效果的方法具有重要的意义。值得注意的是,在大多数3D 虚拟场景中,仅绘制由一次或者二次折射产生的面焦散效果就可以获得很好的真实感。例 如,对于水底场景,通常只需考虑水面对光线的一次折射即可,然而当光线透过玻璃球照射 到桌面上时,则需考虑由二次折射产生的面焦散效果。换句话说,3D虚拟场景中的不封闭的 透明折射面会形成一次折射产生的面焦散效果,而封闭的透明折射体则形成二次折射产生 的面焦散效果。充分利用这一特点,可以设计出不需光子跟踪的算法来绘制由光滑表面折 射产生的面焦散效果。
发明内容
本发明的目的在于提供一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘 制方法。如图1所示,本方法首先创建由光滑表面折射产生的3D虚拟场景中的所有焦散照 明体,然后对每个焦散照明体,判断待绘制场景点是否处于此焦散照明体之中,如果待绘制 场景点处于其中且待绘制场景点所在的焦散照明体位置不受光源遮挡影响,则计算此焦散 照明体对待绘制场景点的光照贡献,并将其加到待绘制场景点的总光照值之中,否则此焦
6散照明体对待绘制场景点的光照贡献为0。本发明首先提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散照明体的 数据结构(100),如图2所示,其包括光滑透明三角形面片的顶点位置P1、顶点位置P2、顶点 位置P3、顶点法向量N1、顶点法向量队、顶点法向量队、折射标识F1、折射标识F2、折射标识 F3、折射光线方向向量队、折射光线方向向量&、折射光线方向向量R3、相交标识T1、相交标 识T2、相交标识T3、交点S1、交点&、交点&、二次折射标识G1、二次折射标识( 、二次折射标 识( 、二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3 等18个成员变量。本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所 有焦散照明体,具体步骤如下步骤(SOll)将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存 入三角形面片列表KAOO》中;将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)并置FlagO = 1, 否则置FlagO = 0并转步骤(S014);(S013-2)根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射 线(AOll),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片 (A012)与折射光线射线(AOll)相交,如果没有,则置Flagl = 0并转步骤(S014),否则置 Flagl = 1,并计算出离顶点(A009)最近的交点(A013),将交点(A013)位置处的三角形面 片(A014)与顶点(A009)相关联,再根据折射定律判断在交点(A013)位置处能否发生折 射,如果发生折射则置Flag2 = 1并计算折射光线方向向量(A015),否则置Flag2 = 0并转 步骤(SO 14);(S013-3)在三角形面片列表1(A002)中,找出包含顶点(A009)的所有三角形面 片(A016),计算顶点(A009)在各三角形面片(A016)的顶点序列中的编号i (i = 1,2,3);将 顶点(A009)的位置及法向量分别赋值给与各三角形面片(A016)相关联的变量(A005)的 顶点位置Pi及顶点法向量Ni成员变量;将FlagO赋值给与各三角形面片(A016)相关联的 变量(A0(^)的折射标识Fi成员变量;将折射光线方向向量(A010)赋值给与各三角形面片 (A016)相关联的变量(A0(^)的折射光线方向向量氏成员变量;将Flagl赋值给与各三角 形面片(A016)相关联的变量(A0(^)的相交标识Ti成员变量;将交点(AOU)赋值给与各三 角形面片(A016)相关联的变量(A0(^)的交点Si成员变量;将Flag2赋值给与各三角形面片(A016)相关联的变量(A005)的二次折射标识Gi成员变量;将折射光线方向向量(A015) 赋值给与各三角形面片(A016)相关联的变量(A0(^)的二次折射光线方向向量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个二次折射标 识&成员变量的值为0(i = 1,2,3),则将三角形面片(A017)从三角形面片列表1(A002) 中删除,否则转步骤(S015);步骤(S015)将三角形面片列表1(A002)中的各个三角形面片(A018)所关联的 变量(A0(^)存入一个列表(A019)中,列表(A019)定义了由光滑表面折射产生的3D虚拟 场景中的所有焦散照明体。本发明的方法(020)部分实现待绘制场景点(B001)的焦散光照值的计算,具体步 骤如下步骤(S021)创建一个包含待绘制场景点(B001)的平面(B002),且平面(B002) 的法向量平行于待绘制场景点(B001)的法向量;步骤(S022)对于列表(A019)中的每个元素(B003),做如下计算(S022-1)如果元素(BOO; )的相交标识T1、相交标识T2、相交标识T3等三个成 员变量都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P1成员变量 表示的顶点,方向平行于元素(B003)的折射光线方向向量R1成员变量表示的方向的射线 (B004),创建一条起始于元素(BOO; )的顶点位置P2成员变量表示的顶点,方向平行于元素 (B003)的折射光线方向向量&成员变量表示的方向的射线(B005),创建一条起始于元素 (B003)的顶点位置P3成员变量表示的顶点,方向平行于元素(BOO; )的折射光线方向向量 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)的折射光 线方向向量札、折射光线方向向量&、折射光线方向向量R3等三个成员变量,通过插值计算 出待绘制场景点(B001)处的折射光线方向向量(B010);(S022-3)创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量 (B010)的反向向量的射线(BOll);计算射线(BOll)与由元素(B003)的顶点位置P1、顶点 位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013); 创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中 是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角形面片¢01 相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光 照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;(S022-4)如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016), 则计算三角形(B016)在三角形面片(B012)所在平面上的投影面积(B017),再计算投影面 积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α ; 如果交点(Β007)、交点(Β008)和交点(Β009)构成一条直线段,则将变量α设置为一个固 定值;创建从交点(BOU)指向光源位置的向量(Β019),对向量(Β019)进行归一化计算; 根据三角形面片¢01 的三个顶点位置,计算三角形面片¢01 的表面法向量(B020); 根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐 射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值 给变量I ¢02 ;根据变量I ¢02 的值、待绘制场景点(B001)的材质属性以及待绘制场 景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型 计算元素(BOO; )表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待 绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献计算;(S022-5)创建一条起始于元素(BOO; )的交点S1成员变量表示的交点位置,方向 平行于元素(B003)的二次折射光线方向向量RS1成员变量表示的方向的射线(B023);创建 一条起始于元素(BOO; )的交点&成员变量表示的交点位置,方向平行于元素(BOO; )的二 次折射光线方向向量成员变量表示的方向的射线(B024);创建一条起始于元素(B003) 的交点&成员变量表示的交点位置,方向平行于元素(BOO; )的二次折射光线方向向量RS3 成员变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算 射线(B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028); 如果待绘制场景点(B001)处于由交点(B(^6)、交点(B027)和交点(B028)确定的三角形 之外或者待绘制场景点(B001)不在由交点(B(^6)、交点(B027)和交点(B028)确定的直 线段之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算, 否则根据待绘制场景点(B001)到交点(BOW)、交点(B027)和交点(B028)的距离以及元 素(B003)的二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向 量旧3等三个成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量 (B029);(S022-6)创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向 向量(B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S1、交点 &、交点&等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元 素(B003)的交点S1、交点&、交点&等三个成员变量表示的交点的距离以及元素(B003)的 折射光线方向向量R1、折射光线方向向量&、折射光线方向向量R3等三个成员变量,通过插 值计算出交点(B031)处的折射光线方向向量(B032);(S022-7)创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的 反向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P1、顶点位置P2、顶 点位置P3等三个成员变量表示的顶点构成的三角形面片¢01 的交点(B034);创建一条 起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片 (B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献 为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;(S022-8)如果交点(B026)、交点(B027)和交点(B028)构成一个三角形(B036), 则计算三角形(B036)在由元素(B003)的交点S1、交点&、交点&等三个成员变量表示的 交点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所 在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片¢01 的面积之比 (B039),将面积之比(B039)赋值给变量β ;如果交点(Β(^6)、交点(Β027)和交点(Β028) 构成一条直线段,则将变量β设置为一个固定值;创建从交点(Β034)指向光源位置的向量 (Β040),对向量(Β040)进行归一化计算;根据三角形面片¢01 的三个顶点位置,计算三 角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表 面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B041),将 照明度(B041)乘以变量β并赋值给变量J(B04》;根据变量J(B04》的值、待绘制场景点 (B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的 反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003) 表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。有益效果本发明提供了一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法。 本发明方法与光子映射方法相比,避免了对大量的从光源发射的光子的跟踪运算,提高了 面焦散效果的绘制效率。另外,本发明方法能够很容易地集成到光线跟踪等全局光照绘制 算法框架之中,可显著地提高3D虚拟场景画面绘制的真实感。
图1是由光滑表面折射产生的3D虚拟场景面焦散效果绘制流程; 图2是光滑表面折射产生的焦散照明体的数据结构。
具体实施例方式为了使本发明的特征和优点更加清楚明白,下面参照附图结合具体实施例对本发 明作进一步的描述。在本实施例中,使用光线跟踪算法绘制3D虚拟场景。由于光线跟踪算法只对镜面 反射光线或者折射光线进行递归跟踪,因此无法绘制出漫反射表面上的面焦散效果。为此, 针对光滑表面折射产生的3D虚拟场景面焦散效果的绘制问题,需要在场景点的光照值计 算中增加一个新过程,以便获得场景点的焦散光照值。计算出所有待绘制场景点的焦散光 照值,就实现了对3D虚拟场景面焦散效果的绘制。将焦散光照值加到标准光线跟踪算法计 算出的场景点光照值之中,可进一步地把面焦散效果合成到最终的3D虚拟场景绘制结果 之中。下面将讲述这个新增加过程的具体实施方式
。本发明首先提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散照明体的 数据结构(100),如图2所示,其包括光滑透明三角形面片的顶点位置P1、顶点位置P2、顶点位置P3、顶点法向量N1、顶点法向量队、顶点法向量队、折射标识F1、折射标识F2、折射标识 F3、折射光线方向向量队、折射光线方向向量&、折射光线方向向量R3、相交标识T1、相交标 识T2、相交标识T3、交点S1、交点&、交点&、二次折射标识G1、二次折射标识( 、二次折射标 识( 、二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3 等18个成员变量。本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所 有焦散照明体,具体步骤如下步骤(SOll)将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存 入三角形面片列表KAOO》中;将3D虚拟场景(AOO》中所有背向光源的光滑透明三角 形面片存入三角形面片列表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)并置FlagO = 1, 否则置FlagO = 0并转步骤(S014);(S013-2)根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射 线(A011),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片 (A012)与折射光线射线(A011)相交,如果没有,则置Flagl = 0并转步骤(S014),否则置 Flagl = 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成员变量;将FlagO赋值给与各三角形面片(A016)相关联的 变量(A0(^)的折射标识Fi成员变量;将折射光线方向向量(A010)赋值给与各三角形面片 (A016)相关联的变量(A0(^)的折射光线方向向量氏成员变量;将Flagl赋值给与各三角 形面片(A016)相关联的变量(A0(^)的相交标识Ti成员变量;将交点(AOU)赋值给与各三 角形面片(A016)相关联的变量(A0(^)的交点Si成员变量;将Flag2赋值给与各三角形面 片(A016)相关联的变量(A005)的二次折射标识Gi成员变量;将折射光线方向向量(A015) 赋值给与各三角形面片(A016)相关联的变量(A0(^)的二次折射光线方向向量RSi成员变 量;
11
步骤(S014)对于三角形面片列表1(A002)中的每个三角形面片(A017),做如下 计算(S014-1)如果与三角形面片(A017)相关联的变量(A005)的第i个折射标识Fi 成员变量的值为0(i = 1,2,3),则将三角形面片(A017)从三角形面片列表1(A002)中删 除,否则转步骤(S015);(S014-2)如果与三角形面片(A017)相关联的变量(A005)的第i个二次折射标 识&成员变量的值为0(i = 1,2,3),则将三角形面片(A017)从三角形面片列表1(A002) 中删除,否则转步骤(S015);步骤(S015)将三角形面片列表1(A002)中的各个三角形面片(A018)所关联的 变量(A0(^)存入一个列表(A019)中,列表(A019)定义了由光滑表面折射产生的3D虚拟 场景中的所有焦散照明体。本发明的方法(020)部分实现待绘制场景点(B001)的焦散光照值的计算,具体步 骤如下步骤(S021)创建一个包含待绘制场景点(B001)的平面(B002),且平面(B002) 的法向量平行于待绘制场景点(B001)的法向量;步骤(S022)对于列表(A019)中的每个元素(B003),做如下计算(S022-1)如果元素(BOO; )的相交标识T1、相交标识T2、相交标识T3等三个成 员变量都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P1成员变量 表示的顶点,方向平行于元素(B003)的折射光线方向向量R1成员变量表示的方向的射线 (B004),创建一条起始于元素(BOO; )的顶点位置P2成员变量表示的顶点,方向平行于元素 (B003)的折射光线方向向量&成员变量表示的方向的射线(B005),创建一条起始于元素 (B003)的顶点位置P3成员变量表示的顶点,方向平行于元素(BOO; )的折射光线方向向量 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)的折射光 线方向向量札、折射光线方向向量&、折射光线方向向量R3等三个成员变量,通过插值计算 出待绘制场景点(B001)处的折射光线方向向量(B010);(S022-3)创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量 (B010)的反向向量的射线(BOll);计算射线(BOll)与由元素(B003)的顶点位置P1、顶点 位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013); 创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中 是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角 形面片¢01 相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光 照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;(S022-4)如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016),则计算三角形(B016)在三角形面片(B012)所在平面上的投影面积(B017),再计算投影面 积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α ; 如果交点(Β007)、交点(Β008)和交点(Β009)构成一条直线段,则将变量α设置为一个固 定值;创建从交点(BOU)指向光源位置的向量(Β019),对向量(Β019)进行归一化计算; 根据三角形面片¢01 的三个顶点位置,计算三角形面片¢01 的表面法向量(B020); 根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐 射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值 给变量I ¢02 ;根据变量I ¢02 的值、待绘制场景点(B001)的材质属性以及待绘制场 景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型 计算元素(BOO; )表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待 绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献计算;(S022-5)创建一条起始于元素(BOO; )的交点S1成员变量表示的交点位置,方向 平行于元素(B003)的二次折射光线方向向量RS1成员变量表示的方向的射线(B023);创建 一条起始于元素(BOO; )的交点&成员变量表示的交点位置,方向平行于元素(BOO; )的二 次折射光线方向向量成员变量表示的方向的射线(B024);创建一条起始于元素(B003) 的交点&成员变量表示的交点位置,方向平行于元素(BOO; )的二次折射光线方向向量RS3 成员变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算 射线(B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028); 如果待绘制场景点(B001)处于由交点(B(^6)、交点(B027)和交点(B028)确定的三角形之 外或者待绘制场景点(B001)不在由交点¢0 )、交点(B027)和交点(B028)确定的直线段 之上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根 据待绘制场景点(B001)到交点(B026)、交点(B027)和交点(B028)的距离以及元素(B003) 的二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量RS3等三个 成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量(B029);(S022-6)创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向 向量(B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S1、交点 &、交点&等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元 素(B003)的交点S1、交点&、交点&等三个成员变量表示的交点的距离以及元素(B003)的 折射光线方向向量R1、折射光线方向向量&、折射光线方向向量R3等三个成员变量,通过插 值计算出交点(B031)处的折射光线方向向量(B032);(S022-7)创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的 反向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P1、顶点位置P2、顶 点位置P3等三个成员变量表示的顶点构成的三角形面片¢01 的交点(B034);创建一条 起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不 透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片 (B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献 为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;(S022-8)如果交点(B026)、交点(B027)和交点(B028)构成一个三角形(B036),则计算三角形(B036)在由元素(B003)的交点S1、交点&、交点&等三个成员变量表示的 交点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所 在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片¢01 的面积之比 (B039),将面积之比(B039)赋值给变量β ;如果交点(Β(^6)、交点(Β027)和交点(Β028) 构成一条直线段,则将变量β设置为一个固定值;创建从交点(Β034)指向光源位置的向量 (Β040),对向量(Β040)进行归一化计算;根据三角形面片¢01 的三个顶点位置,计算三 角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表 面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片(B012)的照明度(B041),将 照明度(B041)乘以变量β并赋值给变量J(B04》;根据变量J(B04》的值、待绘制场景点 (B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的 反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003) 表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。
权利要求
1. 一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法,其特征在于,所需 的数据结构及实现步骤如下所需的数据结构本发明提供一种存储由光滑表面折射产生的3D虚拟场景中的焦散 照明体的数据结构(100),其包括光滑透明三角形面片的顶点位置P1、顶点位置P2、顶点位 置P3、顶点法向量N1、顶点法向量N2、顶点法向量N3、折射标识F1、折射标识F2、折射标识F3、 折射光线方向向量R1、折射光线方向向量&、折射光线方向向量R3、相交标识T1、相交标识 T2、相交标识T3、交点S1、交点&、交点&、二次折射标识G1、二次折射标识(;2、二次折射标识 G3、二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量等 18个成员变量; 实现步骤本发明的方法(010)部分创建由光滑表面折射产生的3D虚拟场景(A001)中的所有焦 散照明体,具体步骤如下步骤(SOll)将3D虚拟场景(A001)中所有面向光源的光滑透明三角形面片存入三角 形面片列表KAOO》中;将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)并置FlagO = 1,否则 置FlagO = 0并转步骤(S014);(S013-2)根据顶点(A009)的位置及折射光线方向向量(A010)创建折射光线射线 (AOll),判断三角形面片列表1(A002)和三角形面片列表2(A003)中是否有三角形面片 (A012)与折射光线射线(AOll)相交,如果没有,则置Flagl = 0并转步骤(S014),否则置 Flagl = 1,并计算出离顶点(A009)最近的交点(A013),将交点(A013)位置处的三角形面 片(A014)与顶点(A009)相关联,再根据折射定律判断在交点(A013)位置处能否发生折 射,如果发生折射则置Flag2 = 1并计算折射光线方向向量(A015),否则置Flag2 = 0并转 步骤(SO 14);(S013-3)在三角形面片列表1(A002)中,找出包含顶点(A009)的所有三角形面片 (A016),计算顶点(A009)在各三角形面片(A016)的顶点序列中的编号i(i = 1,2,3);将 顶点(A009)的位置及法向量分别赋值给与各三角形面片(A016)相关联的变量(A005)的 顶点位置Pi及顶点法向量Ni成员变量;将FlagO赋值给与各三角形面片(A016)相关联的 变量(A0(^)的折射标识Fi成员变量;将折射光线方向向量(A010)赋值给与各三角形面片 (A016)相关联的变量(A0(^)的折射光线方向向量氏成员变量;将Flagl赋值给与各三角形面片(A016)相关联的变量(A0(^)的相交标识Ti成员变量;将交点(AOU)赋值给与各三 角形面片(A016)相关联的变量(A0(^)的交点Si成员变量;将Flag2赋值给与各三角形面 片(A016)相关联的变量(A005)的二次折射标识Gi成员变量;将折射光线方向向量(A015) 赋值给与各三角形面片(A016)相关联的变量(A0(^)的二次折射光线方向向量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),且平面¢00 的法 向量平行于待绘制场景点(B001)的法向量;步骤(S022)对于列表(A019)中的每个元素(B003),做如下计算 (S022-1)如果元素(BOO; )的相交标识T1、相交标识T2、相交标识T3等三个成员变量 都为1,则转(S022-5),否则,创建一条起始于元素(B003)的顶点位置P1成员变量表示的顶 点,方向平行于元素(B003)的折射光线方向向量队成员变量表示的方向的射线(B004),创 建一条起始于元素(BOO; )的顶点位置P2成员变量表示的顶点,方向平行于元素(B003)的 折射光线方向向量&成员变量表示的方向的射线(B005),创建一条起始于元素(B003)的 顶点位置P3成员变量表示的顶点,方向平行于元素(BOO; )的折射光线方向向量&成员变 量表示的方向的射线(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)的折射光线 方向向量札、折射光线方向向量&、折射光线方向向量民等三个成员变量,通过插值计算出 待绘制场景点(B001)处的折射光线方向向量(B010);(S022-3)创建一条起始于待绘制场景点(B001),方向平行于折射光线方向向量 (B010)的反向向量的射线(BOll);计算射线(BOll)与由元素(B003)的顶点位置P1、顶点 位置P2、顶点位置P3等三个成员变量表示的顶点构成的三角形面片(B012)的交点(B013);创建一条起始于交点(B013),终止于光源位置的线段(B014);测试3D虚拟场景(A001)中 是否有不透明的三角形面片(B015)与线段(B014)相交,如果无交则转(S022-4),否则三角 形面片¢01 相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光 照贡献为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算; (S022-4)如果交点(B007)、交点(B008)和交点(B009)构成一个三角形(B016),贝丨J 计算三角形(B016)在三角形面片¢01 所在平面上的投影面积(B017),再计算投影面 积(B017)与三角形面片(B012)的面积之比(B018),将面积之比(B018)赋值给变量α ; 如果交点(Β007)、交点(Β008)和交点(Β009)构成一条直线段,则将变量α设置为一个固 定值;创建从交点(BOU)指向光源位置的向量(Β019),对向量(Β019)进行归一化计算; 根据三角形面片¢01 的三个顶点位置,计算三角形面片¢01 的表面法向量(B020); 根据光源到交点(B013)的距离、向量(B019)与表面法向量(B020)的夹角以及光源的辐 射亮度,计算三角形面片(B012)的照明度(B021),将照明度(B021)乘以变量α并赋值 给变量I ¢02 ;根据变量I ¢02 的值、待绘制场景点(B001)的材质属性以及待绘制场 景点(B001)的法向量与折射光线方向向量(B010)的反向向量的夹角,按照光照反射模型 计算元素(BOO; )表示的焦散照明体对待绘制场景点(B001)的光照贡献值,并将其加到待 绘制场景点(B001)的总光照值之中,结束元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献计算;(S022-5)创建一条起始于元素(BOO; )的交点S1成员变量表示的交点位置,方向平行 于元素(B003)的二次折射光线方向向量RS1成员变量表示的方向的射线(B023);创建一条 起始于元素(BOO; )的交点&成员变量表示的交点位置,方向平行于元素(BOO; )的二次折 射光线方向向量旧2成员变量表示的方向的射线(B024);创建一条起始于元素(B003)的交 点&成员变量表示的交点位置,方向平行于元素(BOO; )的二次折射光线方向向量成员 变量表示的方向的射线(B025);计算射线(B023)与平面(B002)的交点(B026);计算射线 (B024)与平面(B002)的交点(B027);计算射线(B025)与平面(B002)的交点(B028);如 果待绘制场景点(B001)处于由交点(B(^6)、交点(B027)和交点(B028)确定的三角形之外 或者待绘制场景点(B001)不在由交点(B(^6)、交点(B027)和交点(B028)确定的直线段之 上,则结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算,否则根 据待绘制场景点(B001)到交点(B(^6)、交点(B027)和交点(B028)的距离以及元素(B003) 的二次折射光线方向向量RS1、二次折射光线方向向量RS2、二次折射光线方向向量等三 个成员变量,通过插值计算出待绘制场景点(B001)处的二次折射光线方向向量(B029);(S022-6)创建一条起始于待绘制场景点(B001),方向平行于二次折射光线方向向量 (B029)的反向向量的射线(B030);计算射线(B030)与由元素(B003)的交点S1、交点&、 交点&等三个成员变量表示的交点构成的三角形的交点(B031);根据交点(B031)与元素 (B003)的交点S1、交点S2、交点&等三个成员变量表示的交点的距离以及元素(B003)的折 射光线方向向量R1、折射光线方向向量&、折射光线方向向量R3等三个成员变量,通过插值 计算出交点(B031)处的折射光线方向向量(B032);(S022-7)创建一条起始于交点(B031),方向平行于折射光线方向向量(B032)的反 向向量的射线(B033);计算射线(B033)与由元素(B003)的顶点位置P1、顶点位置P2、顶 点位置P3等三个成员变量表示的顶点构成的三角形面片¢01 的交点(B034);创建一条起始于交点(B034),终止于光源位置的线段(B035);测试3D虚拟场景(A001)中是否有不 透明的三角形面片(B015)与线段(B035)相交,如果无交则转(S022-8),否则三角形面片 (B012)相对于光源被部分遮挡,其产生的焦散照明体对待绘制场景点(B001)的光照贡献 为0,结束元素(B003)表示的焦散照明体对待绘制场景点(B001)的光照贡献计算;(S022-8)如果交点(B(^6)、交点(B027)和交点(B028)构成一个三角形(B036),贝丨J 计算三角形(B036)在由元素(BOO; )的交点S1、交点&、交点&等三个成员变量表示的交 点所确定的平面上的投影面积(B037),再计算投影面积(B037)在三角形面片(B012)所 在平面上的投影面积(B038),最后计算投影面积(B038)与三角形面片¢01 的面积之比 (B039),将面积之比(B039)赋值给变量β ;如果交点(Β(^6)、交点(Β027)和交点(Β028) 构成一条直线段,则将变量β设置为一个固定值;创建从交点(Β034)指向光源位置的向量 (Β040),对向量(Β040)进行归一化计算;根据三角形面片¢01 的三个顶点位置,计算三 角形面片(B012)的表面法向量(B020);根据光源到交点(B034)的距离、向量(B040)与表 面法向量(B020)的夹角以及光源的辐射亮度,计算三角形面片¢01 的照明度(B041),将 照明度(B041)乘以变量β并赋值给变量J(B04》;根据变量J(B04》的值、待绘制场景点 (B001)的材质属性以及待绘制场景点(B001)的法向量与二次折射光线方向向量(B029)的 反向向量的夹角,按照光照反射模型计算元素(B003)表示的焦散照明体对待绘制场景点 (B001)的光照贡献值,并将其加到待绘制场景点(B001)的总光照值之中,结束元素(B003) 表示的焦散照明体对待绘制场景点(B001)的光照贡献计算。
全文摘要
本发明公开一种由光滑表面折射产生的3D虚拟场景面焦散效果的绘制方法,属于真实感3D虚拟场景绘制技术领域。当前,常用光子映射算法绘制3D虚拟场景的面焦散效果。光子映射算法要求对光源发射的大量光子进行跟踪计算,这会严重降低3D虚拟场景面焦散效果的绘制效率。本发明首先创建由光滑表面折射产生的3D虚拟场景中的所有焦散照明体,并将其存入相应的数据结构之中;在绘制3D虚拟场景时,通过计算待绘制场景点与焦散照明体之间的位置关系来判断是否需要在该待绘制场景点的光照值中加入此焦散照明体的贡献,最终实现对面焦散效果的绘制。本发明方法可以很容易地集成到光线跟踪算法框架之中,能显著地提高3D虚拟场景绘制的真实感。
文档编号G06T15/50GK102074038SQ20101060861
公开日2011年5月25日 申请日期2010年12月28日 优先权日2010年12月28日
发明者丁莹, 冯欣, 底晓强, 李奇, 杨华民, 范静涛, 蒋振刚, 陈占芳, 陈纯毅, 韩成 申请人:长春理工大学