发明名称 一种基于投影网格的海洋表面建模及实时光照方法
摘要 本发明提供一种基于投影网格的海洋表面建模及实时光照方法,包括:使用投影网格建立海洋表面几何模型,并通过变换摄像机位置和观测方向等参数,检测投影网格与视景体的相交部分,确立处于视景体内的所需绘制的海洋表面的范围;基于快速傅里叶变换(Fast Fourier Transform)来模拟海洋表面的波动效果,根据波浪长度的不同量级,采样不同量级波长的频率并将其转换成振幅信息,用复数空间三角函数和的形式来表示动态变化的波浪;通过将光线分解为太阳入射光、天空反射光和海洋折射光,并将光照计算的积分简化成多项式乘积或者线性函数的形式,来近似计算海洋表面的光照效果。本发明可满足环境光照下对动态海洋表面的仿真,具有高度的逼真性和良好的实时性等优点。
申请公布号 CN102855400B 申请公布日期 2015.09.09
申请号 CN201210333382.0 申请日期 2012.09.10
申请人 北京航空航天大学 发明人 李帅;王东伟;郝爱民;杨丽鹏
分类号 G06F19/00(2011.01)I 主分类号 G06F19/00(2011.01)I
代理机构 北京科迪生专利代理有限责任公司 11251 代理人 杨学明;李新华
主权项 一种基于投影网格的海洋表面建模及实时光照方法,其特征在于:其步骤如下:步骤(1)、在投影面上创建投影网格;步骤(2)、根据视点信息,创建观测矩阵M<sub>View</sub>和透视矩阵M<sub>Perspective</sub>;步骤(3)、检测投影的基本平面与视景体是否相交,如果不相交,说明在当前视点下不需要进行绘制,则转步骤(2),若相交则继续步骤(4);步骤(4)、将步骤(1)在投影面上创建的投影网格中的顶点p<sub>projector</sub>变换到相交的基本平面,得到基本面上的点p<sub>world</sub>,使用观测矩阵和透视矩阵的逆矩阵可以实现这个过程:p<sub>world</sub>=[M<sub>View</sub>·M<sub>Perspective</sub>]<sup>‑1</sup>·p<sub>projector</sub>  (1)步骤(5)、创建范围转换矩阵,检测视景体的边和基本平面的交点以及在视景体内部的基本平面的顶点,并将这些点进行范围转换,此时,x和y的跨度分别被定义为投影后的点的x和y的最大值(x<sub>max</sub>,y<sub>max</sub>)和最小值(x<sub>min</sub>,y<sub>min</sub>)的差;公式(2)即为创建的范围转换矩阵:<maths num="0001" id="cmaths0001"><math><![CDATA[<mrow><msub><mi>M</mi><mi>range</mi></msub><mo>=</mo><mfenced open='[' close=']'><mtable><mtr><mtd><msub><mi>x</mi><mi>max</mi></msub><mo>-</mo><msub><mi>x</mi><mi>min</mi></msub></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>x</mi><mi>min</mi></msub></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><msub><mi>y</mi><mi>max</mi></msub><mo>-</mo><msub><mi>y</mi><mi>min</mi></msub></mtd><mtd><mn>0</mn></mtd><mtd><msub><mi>y</mi><mi>min</mi></msub></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd><mtd><mn>0</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable></mfenced><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>2</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000011.GIF" wi="1138" he="327" /></maths>接下来,对海洋表面进行快速傅里叶变换,实现海洋表面的波动效果,海洋表面的频谱是海浪波的一种属性,与波长有一定的关系,它的大小决定着海洋波浪波峰的密级程度,通过对已经建模好的海洋表面进行频率采样,可以模拟具有一定振幅的海洋波动效果;由于形成海洋的波浪波长范围变化很大,从厘米级到公里级,所以为了真实模拟海洋的波动情况,需要对不同频率的波长分别进行采样:S(k)=k<sup>‑3</sup>(B<sub>l</sub>+B<sub>h</sub>)   (5)其中B<sub>l</sub>和B<sub>h</sub>分别代表低频和高频部分,在获取到每个样本处不同的频率后再将相应的频率转化成对应的振幅:<maths num="0002" id="cmaths0002"><math><![CDATA[<mrow><mi>h</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow><mo>=</mo><mfrac><mn>1</mn><msqrt><mn>2</mn></msqrt></mfrac><mrow><mo>(</mo><msub><mi>&xi;</mi><mi>r</mi></msub><mo>+</mo><mi>i</mi><msub><mi>&xi;</mi><mi>i</mi></msub><mo>)</mo></mrow><msqrt><mi>S</mi><mrow><mo>(</mo><mi>k</mi><mo>)</mo></mrow></msqrt><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>6</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000012.GIF" wi="773" he="136" /></maths>ξ<sub>r</sub>和ξ<sub>i</sub>表示随机函数生成器生成的随机数的余弦和正弦值,将公式(5)得到的S(k)带入根式,即可使用复数空间的三角函数表示波浪的振幅,最后,根据时间的变化,进行实时更新;得到海洋表面的振幅后,就可使用快速傅里叶变换合成海洋表面的高度,快速傅里叶变换采用分治策略,将转换成高度数据的实数部分和虚数部分分别进行处理,通过蝴蝶变换,以及n次单位复根的相消引理,折半引理和求和引理,可简化多项式乘法的计算,将时间复杂度降为nlgn;海洋表面的光照主要有三个部分组成,太阳的入射光线,天空反射光线和海洋折射光线,将这三种光照分量分别进行计算并加以混合,即可得到最终的光照强度;1).入射光线:因为海洋的波动是海洋表面在自己的平衡位置做往复运动,并没有发生前后左右的移动,对于光照模型中所需的物体表面法线信息,使用观测向量和入射光线的中间向量来近似替代法线,2).反射光线:将天空的反射光线约等为平均菲涅尔反射和天空平均辐射照度乘积的形式,通过使用纹理过滤技术来近似上述积分运算:<maths num="0003" id="cmaths0003"><math><![CDATA[<mrow><msub><mi>I</mi><mi>sky</mi></msub><mo>&ap;</mo><mover><mi>F</mi><mo>&OverBar;</mo></mover><mover><mi>L</mi><mo>&OverBar;</mo></mover><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>9</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000021.GIF" wi="388" he="89" /></maths>(1)平均菲涅尔反射:等式(10)表示平均菲涅尔反射:<maths num="0004" id="cmaths0004"><math><![CDATA[<mrow><mover><mi>F</mi><mo>&OverBar;</mo></mover><mrow><mo>(</mo><mi>v</mi><mo>)</mo></mrow><mo>=</mo><msubsup><mrow><mo>&Integral;</mo><mo>&Integral;</mo></mrow><mrow><mo>-</mo><mo>&infin;</mo></mrow><mo>&infin;</mo></msubsup><mi>p</mi><mrow><mo>(</mo><mi>&zeta;</mi><mo>)</mo></mrow><msup><mi>&rho;</mi><mo>&prime;</mo></msup><mrow><mo>(</mo><mi>v</mi><mo>,</mo><mi>&zeta;</mi><mo>)</mo></mrow><msup><mi>d</mi><mn>2</mn></msup><mi>&zeta;</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>10</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000022.GIF" wi="837" he="101" /></maths>平均菲涅尔反射表示反射光线的强度取决于观测角度;在计算天空的入射光线时,已经假设海洋表面的波动情况微小,所以网格表面的法线在垂直位置附近来回摆动,在计算的过程中,使用观测方向和垂直方向的夹角来代替观测方向和法线的夹角,因而可将公式(10)的二次积分近似为线性方程的形式:<maths num="0005" id="cmaths0005"><math><![CDATA[<mrow><mover><mi>F</mi><mo>&OverBar;</mo></mover><mrow><mo>(</mo><mi>v</mi><mo>)</mo></mrow><mo>&ap;</mo><mi>R</mi><mo>+</mo><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>R</mi><mo>)</mo></mrow><mfrac><msup><mrow><mo>(</mo><mn>1</mn><mo>-</mo><msub><mrow><mi>cos</mi><mi>&theta;</mi></mrow><mi>v</mi></msub><mo>)</mo></mrow><mrow><mn>5</mn><mi>exp</mi><mrow><mo>(</mo><mo>-</mo><mn>2.69</mn><msub><mi>&sigma;</mi><mi>v</mi></msub><mo>)</mo></mrow></mrow></msup><mrow><mn>1</mn><mo>+</mo><mn>22.7</mn><msubsup><mi>&sigma;</mi><mi>v</mi><mn>1.5</mn></msubsup></mrow></mfrac><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>11</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000023.GIF" wi="1031" he="163" /></maths>(2)天空平均辐射照度:<maths num="0006" id="cmaths0006"><math><![CDATA[<mrow><mover><mi>L</mi><mo>&OverBar;</mo></mover><mrow><mo>(</mo><mi>v</mi><mo>)</mo></mrow><mo>=</mo><msubsup><mrow><mo>&Integral;</mo><mo>&Integral;</mo></mrow><mrow><mo>-</mo><mo>&infin;</mo></mrow><mo>&infin;</mo></msubsup><mi>p</mi><mrow><mo>(</mo><mi>&zeta;</mi><mo>)</mo></mrow><msub><mi>L</mi><mi>sky</mi></msub><mrow><mo>(</mo><mi>r</mi><mo>)</mo></mrow><msup><mi>d</mi><mn>2</mn></msup><mi>&zeta;</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>12</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000024.GIF" wi="802" he="100" /></maths>首先,将天空的平均辐射亮度存储在一张纹理中;其次,将网格表面的斜率转换成对应的纹理坐标;最红,使用纹理采样函数提取天空平均辐射亮度;最终,得到计算平均辐射照度的公式如下:<maths num="0007" id="cmaths0007"><math><![CDATA[<mrow><mover><mi>L</mi><mo>&OverBar;</mo></mover><mo>&ap;</mo><mi>tex</mi><mn>2</mn><mi>D</mi><mrow><mo>(</mo><mi>sampler</mi><mo>,</mo><mi>tc</mi><mo>,</mo><mi>dFdx</mi><mrow><mo>(</mo><mi>tc</mi><mo>.</mo><mi>x</mi><mo>)</mo></mrow><mo>,</mo><mi>dFdy</mi><mrow><mo>(</mo><mi>tc</mi><mo>.</mo><mi>y</mi><mo>)</mo></mrow><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>13</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000025.GIF" wi="1239" he="111" /></maths>3).折射光线根据菲涅尔定律,光线照射到不同介质表面时,入射光线夹角的正弦和折射光线夹角的正弦比值为一个常数,如等式(14):<maths num="0008" id="cmaths0008"><math><![CDATA[<mrow><mfrac><mrow><mi>sin</mi><msub><mi>&theta;</mi><mi>v</mi></msub></mrow><mrow><mi>sin</mi><mi>&beta;</mi></mrow></mfrac><mo>=</mo><mi>n</mi><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>14</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000031.GIF" wi="466" he="149" /></maths>所以只需将<img file="FDA0000707731710000032.GIF" wi="72" he="69" />代替<img file="FDA0000707731710000033.GIF" wi="71" he="70" />便可采用与反射光线相同的计算方法,近来似折射光强的计算,在计算时不考虑多重折射,得到最终折射光线的计算公式为:<maths num="0009" id="cmaths0009"><math><![CDATA[<mrow><msub><mi>I</mi><mi>sea</mi></msub><mo>&ap;</mo><msub><mi>L</mi><mi>sea</mi></msub><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mover><mi>F</mi><mo>&OverBar;</mo></mover><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>15</mn><mo>)</mo></mrow></mrow>]]></math><img file="FDA0000707731710000034.GIF" wi="577" he="85" /></maths>步骤(6)、生成动态海洋网格,并基于GPU对模拟结果进行实时绘制。
地址 100191 北京市海淀区学院路37号