一种三维场景中海量模型实时阴影的显示方法
【技术领域】
[0001]本发明属于计算机三维态势显示处理领域,具体地说是一种三维场景中海量模型 实时阴影的显示方法。
【背景技术】
[0002] 实时阴影仿真技术是增加虚拟场景真实感的关键技术,在三维游戏、虚拟训练系 统、三维地理信息系统等方面有着广泛的应用。其中,阴影是比较常用的一种仿真技术,近 年来该技术提出的算法很多,整体性能在向好的方向发展,同时仿真的效果也越来越真实, 但在海量模型的实时阴影处理方面均存在一些效率上的瓶颈。本发明通过充分解析三维模 型数据结构,应用阴影形成理论以及底层渲染引擎的工作原理,对阴影的构建算法进行了 改进,大幅提升了海量模型实时阴影的处理效率。
[0003] 通常情况下,在三维场景中,传统的阴影计算算法都是直接遍历每个面,再记录并 统计每个面的邻接边,后续再在邻接边中筛选出轮廓边,计算量大、效率低,如图4所示。另 外当前通用的阴影处理都是按照统一的全球日出日落时间,从而导致在不同季节、不同地 区的阴影显示与实际情况不相符,影响了阴影的真实性。
【发明内容】
[0004] 本发明的目的在于提供一种三维场景中海量模型实时阴影的显示方法,该方法可 以在三维场景中,根据模型的位置和时间,通过优化阴影的生成算法,提升阴影的生成效 率,能快速地实现海量模型数据的实时阴影计算,能真实地表现模型的阴影效果。
[0005] 本发明公开了一种三维场景中海量模型实时阴影的显示方法,包括:
[0006] 步骤1,阴影创建;
[0007] 步骤2,形成模型阴影体;
[0008] 步骤3,构建阴影体;
[0009] 步骤4,对阴影体进行渲染。
[0010] 本发明步骤1阴影创建中,加载并解析模型,获取模型的网格节点,从网格节点中 提取模型坐标空间的坐标信息(X、Y、Z)、点信息和面结构信息,计算每个面的法向量 Normal,,其中i表示面的索引序号,形成对应面结构信息,每个面最多有三个邻接面,若没 有邻接面则法向量赋空,由此得到模型所处位置。
[0011] 本发明步骤2形成模型阴影中,根据模型所处位置,计算太阳位置以及太阳光方 向,将太阳位置坐标转换到模型坐标空间,对模型的每个面进行向光性计算,并进行共享边 的计算,针对每个邻接边,构建阴影。
[0012] 本发明步骤2包括:
[0013] 步骤2.1,根据模型所在位置的经炜度信息Lng与Lat计算日出与日落时间,计算太 阳位置以及太阳光方向,:
[0014] 记当前时间为T,分别为年、月、日、时、分、秒,将T表示为:
[0015] T= {Year,Month、Day、Hours、Minute、Second};
[0016] 记当前时区为Tzone,Tzone由偏离率Bias与标准偏离率StandardBias组成,将 Tzone表亦为:
[0017] Tzone = {Bias,StandardBias};
[0018] 记日出时间为Tsunrise,日落时间为Tsunset,各由两个元素组成,分别为小时、分,将 Tsunrise 与 T sunset 表示为:
[0019] Tsunrise= {Hour,Minute},
[0020] Tsunrise. η· = 24 · 0*cos(Lat*PI/l 80)+Tzone .Bias/24.0+cos(Lat*PI/l 80 )/360;
[0021] 其中1^"也(3.11。虹为日出时间中的小时项,?1为标准圆周率、了20116.81 &8为时区的偏 离率;
[0022] 日出时间中的分钟项T_rise · Minute = 60 · 0* (T_rise · Hour/24);
[0023] Tsunset= {Hour,Minute},
[0024] 日落时间中的小时项Tsunset · Hour = 24 · 0*cos(Lat*PI/180)+Tzone · Bias/24 · 〇-cos(Lat*PI/180)/360;
[0025] 日落时间中的分钟项T sunset. Minute = 60.0*(T sunset. Hour/24);
[0026] 若T的时、分均在日出与日落时间范围内,即Tsunset.HouKT.Hou rs〈Tsunrise.H·, Tsunset · Η〇?Γ〈Τ · MinUte^T'sumrise.Minute ? 则继续以下过程计算太阳位置:
[0027] 记太阳位置Veclight = {x,y,z},Veclight.x,Veclight.y,Veclight.z分别代表 世界坐标下三个方向的分量,单位为米,贝太阳光方向向量Dirlight的计算过程如下:
[0028] L=sqrt(Veclight.x*Veclight. x+Vecl ight .y*Veclight.y+Veclight.z* Veclight.z));
[0029]
[0030] L为中间参数,sqrt为开根号;
[0031 ]步骤2.2,将太阳位置坐标转换到目标模型坐标空间:
[0032] 记太阳位置向量为Veclight,进行如下步骤:
[0033] 计算放缩转换矩阵Matscale,用于保持物体的大小与实际比例一致:
[0034]
[0035]计算偏移矩阵Mattrans,用于使模型放置在正确的位置:
[0036]
[0037] 上式中V. X,V. y,V. z分别代表模型的空间坐标位置,单位为米;
[0038]根据模型的经经炜度计算旋转矩阵Matrcitate,用于使模型保持正向:
[0039]
[0040]上式中lng、lat分别为模型的经炜度;
[0041 ] 记目标模型矩阵为MaU-i,目标模型矩阵的逆矩阵为MatInvers_dei,
[0042] Mcltmodel-Miltr〇tatel*M£ltscale*M£lttrans,
[0043] Mcltinversemodel-Mcltmodel ;
[0044] 符号表示逆矩阵,;
[0045] 进行赋值操作,将Vecl ight在Matinvers_dei做转换,公式为;
[0046] Vecl ight = Vecl ight*MatinverseM〇dei;
[0047] 步骤2.3,计算轮廓边:
[0048] 遍历每个基本面即原始模型的三角面片,计算其法向量与太阳光方向夹角,判断 其向光性,依次计算基本面的三条边El、E2、E3所对应的邻接面的向光性,若邻接面的向光 性与基本面的向光性不一致,则判定两者之间的公共边为轮廓边;若基本面的指定边没有 邻接面,则直接判定该边为轮廓边;
[0049]计算出当前面的法向量之后,根据光源位置判断当前面是否是背光面,如果当前 面面对光源时j <a 则cost(a)〈0,即当前面法向量与入射光线方向向量的点积小于 〇;所以只有法向量与与入射光线的点积大于〇,即c〇st(a)>0时,表示该面背对光源,记面的 向光性为FaceLight:
[0050]
[0051] 上式中,j表示面的索引序号当太阳光入射角与面向量之间的夹角大于90度且小 于180度时,其为向光面,否则为背光面;
[0052] 步骤2.4,获取共享边:
[0053]如果三角面片A的三个顶点序号为{Vo JhVd,三角面片A的邻接面的顶点序号为 {AdjVo、AdjVi、AdjV2},则邻接边AdjEdge的计算算法如下:
[0054]
[0055]上述公式中,k表示公共边索引,记三角面A的三个顶点为,其相邻的三 角面B的顶点为0心飞〇^(^飞1^(^飞2},在三角面4与8不重合的情况下,则两个三角面片之间 最多只有一个公共边;若A与B重合,则二者有三个公共边,此时只取三角面A做向光性分析, 对三角面B不做处理;若三角面A与B相离,则二者没有公共边。
[0056]本发明步骤3针对每个邻接边,构建阴影:
[0057] 记每条轮廓边的两个顶点为V^Vs,光照方向向量为Vllght,则别在地面上的 投影点V3、V4计算过程如下:
[0058] V3 = Vi-Viight,
[0059] V4=V2-Viight〇
[0060] 本发明步骤4对阴影进行渲染:对形成的阴影进行渲染,再通过模板技术对阴影着 色。
[0061 ]本发明与现有技术相比具有以下的优点:
[0062] 1)对阴影体的形成算法
进行了简化,将向光性计算与轮廓边计算过程进行统一, 大幅提升了效率;
[0063] 2)不再使用统一的全球日出日落时间,而是根据阴影的实际位置计算日出日落时 间,从而提升了阴影的真实性;
[0064] 3)对阴影的颜色、透明度可调,从而增强了阴影的显示效果。
【附图说明】
[0065] 图1是本发明的邻接面数据结构示意图。
[0066] 图2是本发明的面与法向量示意图。
[0067] 图3是本发明的向光性与背光性示意图。
[0068] 图4是传统阴影轮廓边的生成过程示意图。
[0069] 图5是本发明的阴影轮廓边的生成过程示意图。
[0070] 图6是本发明的最终阴影示意图。
[0071] 图7为本发明流程图。
【具体实施方式】
[0072]本发明提供了一种三维场景中海量模型的实时阴影处理方法。该方法通过充分解 析三维模型数据结构,应用阴影形成理论以及底层渲染引擎的工作原理,对阴影的构建算 法进行了改进,大幅提升了海量模型实时阴影的处理效率。本发明解决了在三维场景中,海 量模型的实时阴影的生成、更新、绘制等过程效率较低的问题,同时可根据位置点的经炜度 实时计算日出日落的时间,在三维场景中较真实地展现了海量模型的阴影。本发明首先对 阴影进行创建,加载并解析模型,获取模型的网格节点,从网格中提取坐标信息(x、Y、z)、点 信息和面结构信息,计算每个面的法向量(Normali),形成特有的面结构信息,根据模型所 处位置计算日出日落时间,形成阴影的轮廓边;对形成的阴影进行渲染,并通过模板技术对 阴影着色。
[0073]如图7所示,实现本发明的技术解决方案步骤如下:
[0074]步骤1、阴影创建过程;
[0075]首先加载并解析模型,获取模型的网格节点,从网格中提取坐标信息(X、Y、Z)、点 信息和面结构信息,计算每个面的法向量(Normal),形成特有的面结构信息,每个面最多有 三个邻接面,若没有邻接面则赋空 [0076]步骤2、阴影形成过程;
[0077]根据模型所处位置计算日出日落时间,如当前时间点该位置点不具备阴影形成能 力,则不进行计算;否则,计算太阳位置以及太阳光方向,并将太阳位置坐标转换到模型坐 标空间,遍历每个基本面,计算其法向量与太阳光方向夹角,判断其向光性,再依次计算其 三条边E1、E2、E3所对应的邻接面的向光性,若邻接面的向光性与基本面的向光性不一致, 则记录两者之间的公共边为轮廓边;若基本面的指定边没有邻接面,则直接记录该边为轮 廓边。
[0078]步骤3、阴影渲染过程;
[0079] 步骤4对阴影进行渲染:对形成的阴影进行渲染,再通过模板技术对阴影着色。
[0080] 步骤1中的模型简化过程能在保证阴影正确性的基础上,提升处理的效率。
[0081] 将面的向光性计算与轮廓边计算过程统一,提升了实时阴影的计算效率。
[0082] 实施例
[0083]如图6所示,本实施例提供一种三维场景中海量模型实时阴影体的显示方法,其具 体实施步骤如下:
[0084]步骤1、三维模型的创建过程和方法:加载模型,获取网格节点,并进行简化,从网 格中提取坐标信息(X、Y、Z)、点信息和面结构信息,计算每个面的法向量(Normah)。
[0085] Facei= {Vo,Vi,V2}
[0086] Normali= (V2-V1) X (V1-V0)
[0087] 上述公式中各参数如图2所示,形成特有的面结构信息,每个面最多有三个邻接 面,若没有邻接面则法向量赋空,具体的面结构信息,如图1所示。
[0088] 步骤2、形成模型的阴影:以基于步骤1所获得的数据值为基准,根据模型所处位 置,计算太阳位置以及太阳光方向,将太阳位置坐标转换到模型坐标空间,对模型的每个面 进行向光性计算,其向光性和逆光性如图3所示,并进行共享边的计算,针对每个邻接边,构 建阴影,具体算法如下:
[0089] 2.1根据模型所在位置的经炜度信息Lng与Lat计算日出与日落时间,计算太阳位 置以及太阳光方向,:
[0090] 记当前时间为T,分别为年、月、日、时、分、秒,将T表示为:
[0091 ] T={Year,Month、Day、Hours、Minute、Second};
[0092] 记当前时区为Tzone,Tzone由偏离率Bias与标准偏离率StandardBias组成,将 Tzone表不为:
[0093] Tzone = {Bias,StandardBias};
[0094] 记日出时间为T_rise,日落时间为T_set,各由两个元素组成,分另IJ为小时、分,将 Tsunrise 与 T sunset 表示为:
[0095] TSUnrise= {Hour,Minute},
[0096] 日出时间中的小时项 Tsunrise.H〇ur = 24.0*cos(Lat*PI/180)+Tzone.Bias/24.0+cos 〇^#?1/180)/360;(?1为标准圆周率、了2〇1^.81 &8为时区的偏离率)
[0097] 日出时间中的分钟项 Tsunrise ·Μ?ηιι?θ = 60·0*(Τ3-·Ηοι^/24);
[0098] Tsunset= {Hour ?Minute} ?
[0099] 日落时间中的小时项TSunset·Hour = 24·0*cos(Lat*PI/180)+Tzone·Bias/24·0-cosαat*PI/180)/360;
[0100] 日落时间中的分钟项T sunset. Minute = 60.0*(T sunset. Hour/24);
[0101] 若T的时、分均在日出与日落时间范围内,即Tsunset.Hour〈T.Hours〈T sunrise.H·, Tsunset · Η〇?Γ〈Τ · MinUte^T'sumrise.Minute ? 则继续以下过程计算太阳位置:
[0102] 记太阳位置Veclight = {x,y,z},Veclight.x,Veclight.y,Veclight.z分别代表 世界坐标下三个方向的分量,单位为米,贝太阳光方向Dirlight的计算过程如下:
[0103] L=sqrt(Veclight.x*Veclight. x+Vecl ight .y*Veclight.y+Veclight.z* Veclight.z));
[0104]
[0105] 2.2,将太阳位置坐标转换到目标模型坐标空间:
[0106] 记太阳位置向量为Veclight,则有如下计算过程:
[0107] 计算放缩转换矩阵Mats。^,用于保持物体的大小与实际比例一致:
[0108]
[0109]计算偏移矩阵Mattrans,用于使模型放置在正确的位置:
[0110]
[0111]上式中V. X,V. y,V. z分别代表模型的空间位置,单位为米;
[0112]根据模型的经经炜度计算旋转矩阵Matrcitate,用于使模型保持正向:
[0113]
[0114] 上式中lng、lat分别为模型的经炜度;
[0115] 记目标模型矩阵为MatM(fei,目标模型矩阵的逆矩阵为MatInvers_ dei,
[011 6] Mcltmodel -M£ltrotatel*M£ltscale*M£lttrans,
[01 1 7] Matinversemodel -Matmodel ;(表/」、3^矩|^ ),
[0118] Veclight = Veclight*MatlnverseModel ;(即将Veclight在Matinversemodel做转换,为赋 值操作)。,
[0119] 2.3计算轮廓边:
[0120] 遍历每个基本面,计算其法向量与太阳光方向夹角,判断其向光性,再依次计算其 三条边E1、E2、E3所对应的邻接面的向光性,若邻接面的向光性与基本面的向光性不一致, 则记录两者之间的公共边为轮廓边;若基本面的指定边没有邻接面,则直接记录该边为轮 廓边;
[0121] 2.4面的向光性计算法:
[0122] 计算出当前面的法向量之后,就可以根据光源位置判断当前面是否是背光面。如 图3所示,如果当前面面对光源时,$ <α 则cost(a)〈〇,即当前面法向量与入射光线方 向向量的点积小于〇。所以只有法向量与与入射光线的点积大于〇,即C 〇 s t (a )> 〇时,才表示 该面背对光源。记面的相关性为FaceLight(i):
[0123] 、
、 L·/
[0124] 上式中,j表示面的索引序号,当太阳光入射角与面向量之间的夹角大于90度且小 于180度时,其为向光面,否则为背光面。
[0125] 2.5获取共享边
[0126] 记当前面的顶点序号为¥0、¥1、¥2、¥3、¥4、¥5和¥6,邻接面的顶点序号为4心10、 Ad j V1、Ad j V2,参数如图5所示,贝lj邻接边Ad j Edge的计算算法如下:
[0127]
[0128] 上述公式中,k表示公共边索引,记三角面A的三个顶点为{Vo,Vi,V2},其相邻的三 角面B的顶点为0心飞 ()^(1」¥1^(1」¥2},在4与8不重合的情况下,则两个三角面片之间最多只 有一个公共边;若A与B重合,则二者有三个公共边,在这种情况下,只需取A做向光性分析, 对B不做处理;若A与B相离,则二者没有公共边。
[0129] 3、针对每个邻接边,构建阴影体:
[0130] 如图6所示(本实施例特性,为展示阴影形成过程,必须由灰度渐变的效果图表 示),记每条轮廓边的两个顶点为LV2,光照方向向量为V llght,则分别在地面上的投影 点V3、V4计算过程如下:
[0131] V3 = Vi-Viight
[0132] V4=V2-Viight
[0133] 4、对阴影体进行渲染:
[0134] 对形成的阴影进行渲染,再通过模板技术对阴影着色。
[0135] 本发明提供了一种三维场景中海量模型实时阴影的显示方法,具体实现该技术方 案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的 普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进 和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以 实现。
【主权项】
1. 一种三维场景中海量模型实时阴影的显示方法,其特征在于,包括: 步骤1,阴影创建; 步骤2,形成模型阴影体; 步骤3,构建阴影体; 步骤4,对阴影体进行渲染。2. 根据权利要求1所述的方法,其特征在于,步骤1阴影创建中,加载并解析模型,获取 模型的网格节点,从网格节点中提取模型坐标空间的坐标信息(X、Y、Z)、点信息和面结构信 息,计算每个面的法向量Normal 1,其中i表示面的索引序号,形成对应面结构信息,每个面 最多有三个邻接面,若没有邻接面则法向量赋空,由此得到模型所处位置。3. 根据权利要求2所述的方法,其特征在于,步骤2形成模型阴影中,根据模型所处位 置,计算太阳位置以及太阳光方向,将太阳位置坐标转换到模型坐标空间,对模型的每个面 进行向光性计算,并进行共享边的计算,针对每个邻接边,构建阴影。4. 根据权利要求3所述的方法,其特征在于,步骤2包括: 步骤2.1,根据模型所在位置的经炜度信息Lng与Lat计算日出与日落时间,计算太阳位 置以及太阳光方向,: 记当前时间为T,分别为年、月、日、时、分、秒,将T表示为: T={Year,Month、Day、Hours、Minute、Second}; 记当前时区为Tzone,Tzone由偏离率Bias与标准偏离率StandardBias组成,将Tzone表 示为: Tzone={Bias,StandardBias}; 记日出时间为Tsunrise,日落时间为Tsunset,各由两个兀素组成,分别为小时、分,将Tsunri se -^Tsunset 表示为: Tsunrise {Hour,Minute}, Tsunrise.Hour_ 24.0*cos(Lat*PI/180)+Tzone.Bias/24.0+cos(Lat*PI/180)/360; 其中Tsunrise.Fw为日出时间中的小时项,PI为标准圆周率、Tzone.Bias为时区的偏离 率; 日出时间中的分钟项Tsunrise .Minute = 60.0*(Tsunrise. Hour/24); Tsunset= {Hour ,Minute} ? 日落时间中的小时项Tsunset .Hour = 24.0*cos(Lat*PI/180)+Tzone.Bias/24.0_cos (Lat*PI/180)/360; 日落时间中的分钟项T sunset. Minute = 60.0*(TS unset. Hour/24); 若T的时、分均在日出与日落时间范围内,即Tsu nset. Η〇11Γ〈Τ · H〇UrS〈Tsunrise. Hour, Tsunset · Η〇?Γ〈Τ · MinutΘ〈Tsunrise.Minute, 则继续以下过程计算太阳位置: 记太阳位置Veclight = {x,y,z},Veclight .x,Veclight.y,Veclight · z分别代表世界 坐标下三个方向的分量,单位为米,则太阳光方向向量D ir I i ght的计算过程如下: L=sqrt(Veclight.x*Veclight.x+Veclight.y*Veclight.y+Veclight.z* Veclight.z));L为中间参数,sqrt为开根号; 步骤2.2,将太阳位置坐标转换到目标模型坐标空间: 记太阳位置向量为Veclight,进行如下步骤: 计算放缩转换矩阵Matsrale3,用于保持物体的大小与实际比例一致:计算偏移矩阵Mattrans,用于使模型放置在正确的位置:上式中¥.1,¥.7,¥.2分别代表模型的空间坐标位置,单位为米; 根据模型的经经炜度计算旋转矩阵Matrcitate,用于使模型保持正向:上式中lng、lat分别为模型的经炜度; 记目标模型矩阵为MatmcideI,目标模型矩阵的逆矩阵为MatlnversemcideI, Matmodel - Mstrotate cal θ^Μβ?? rans ? Matinversemodel - Mat-model ; 符号表亦逆矩阵,; 进行赋值操作,将Vecl ight在Matinversemodel做转换,公式为; Veclight - VeC I i ght*MatlnverseModel; 步骤2.3,计算轮廓边: 遍历每个基本面即原始模型的三角面片,计算其法向量与太阳光方向夹角,判断其向 光性,依次计算基本面的三条边El、E2、E3所对应的邻接面的向光性,若邻接面的向光性与 基本面的向光性不一致,则判定两者之间的公共边为轮廓边;若基本面的指定边没有邻接 面,贝 1J直接判定该边为轮廓边; 计算出当前面的法向量之后,根据光源位置判断当前面是否是背光面,如果当前面面 对光源时,则cost (α)〈〇,即当前面法向量与入射光线方向向量的点积小于〇 ;所 以只有法向量与与入射光线的点积大于〇,即COSt(Ct)X)时,表示该面背对光源,记面的向光 性为FaceLight:上式中,j表示面的索引序号当太阳光入射角与面向量之间的夹角大于90度且小于180 度时,其为向光面,否则为背光面; 步骤2.4,获取共享边: 如果三角面片A的三个顶点序号为U^V1, V2},三角面片A的邻接面的顶点序号为 {AdjVo、AdjVi、AdjV2},则邻接边AdjEdge的计算算法如下:上述公式中,k表示公共边索引,记三角面A的三个顶点为{Vo,%,V2},其相邻的三角面B 的顶点为{AdjVo JdjV1JdjV2K在三角面A与B不重合的情况下,则两个三角面片之间最多 只有一个公共边;若A与B重合,则二者有三个公共边,此时只取三角面A做向光性分析,对三 角面B不做处理;若三角面A与B相离,则二者没有公共边。5. 根据权利要求4所述的方法,其特征在于,步骤3针对每个邻接边,构建阴影:记每条 轮廓边的两个顶点为Vi、V2,光照方向向量为Vi ight,则别在地面上的投影点V3、V4计算 过程如下: V3 = Vi-Viight, V4 = V2 _ Vl i ght 〇6. 根据权利要求5所述的方法,其特征在于,步骤4对阴影进行渲染:对形成的阴影进行 渲染,再通过模板技术对阴影着色。
【专利摘要】本发明提供了一种三维场景中海量模型的实时阴影处理方法。该方法通过充分解析三维模型数据结构,应用阴影形成理论以及底层渲染引擎的工作原理,对阴影的构建算法进行了改进,大幅提升了海量模型实时阴影的处理效率。本发明解决了在三维场景中,海量模型的实时阴影的生成、更新、绘制等过程效率较低的问题,同时可根据位置点的经纬度实时计算日出日落的时间,在三维场景中较真实地展现了海量模型的阴影。
【IPC分类】G06T15/60
【公开号】CN105488844
【申请号】CN201510814953
【发明人】李彭伟, 王颖, 李涛, 孙耀宗, 刘辰炜
【申请人】中国电子科技集团公司第二十八研究所
【公开日】2016年4月13日
【申请日】2015年11月19日