一种顾及积云密度的阴影分析与三维可视化方法

文档序号:29632006发布日期:2022-04-13 16:11阅读:171来源:国知局
一种顾及积云密度的阴影分析与三维可视化方法

1.本发明涉及三维地理信息可视化技术领域,特别是涉及一种基于三维积云体素模型实现顾及积云密度的阴影分析和在三维地理场景中实现阴影可视化的方法。


背景技术:

2.在晴空环境下,云团是造成太阳辐射大幅波动的最主要因素(王诚良,朱凌志,党东升,赵亮,丁煌.云团移动对光伏电站出力特性及系统调频的影响[j].可再生能源,2017,35(11):1626-1631),尤其是在光伏发电领域,不同厚度的云团对太阳辐射的削弱程度不同,从而导致了到达每块光伏组件表面的太阳辐照量不同。因此,实现顾及云密度的阴影分析能够进一步提高光伏发电功率计算的准确性。
[0003]
在三维地理空间场景中,光影能够反映空间中物体之间的相互遮挡关系,辅助理解物体在场景中的位置形态,是计算机图形学领域中的热点问题之一。目前主流的阴影渲染算法主要有阴影体算法和阴影图算法,阴影体算法虽然精度高,但是需要根据光源和遮蔽物的位置关系计算场景中的阴影区域,这导致该算法难以适用于复杂的三维地理场景。而阴影图算法具有原理简单、算法复杂度低的优势,被广泛应用于实时阴影绘制中。为了解决该算法存在的锯齿、条带或伪影等走样问题,衍生了一系列优化算法,例如软阴影图算法(曾晓一,何援军.软阴影算法及实现[j].工程图学学报,2010,31(04):27-31.),通过柔化阴影边界的锯齿,使得阴影区到非阴影区能够平滑过渡,从而解决标准阴影图算法中的边缘瑕疵问题;级联阴影图方法(谭力恒,万荣锋,万刚,李锋.全球虚拟地理环境中实时阴影关键技术研究[j].系统仿真学报,2017,29(s1):67-74.)根据视锥体和当前场景大小设置多层阴影贴图,实现大规模复杂虚拟环境中的不同尺度下的实时阴影渲染。
[0004]
目前对三维场景中的阴影研究,主要集中于由不透明的遮挡物形成的阴影范围以及对阴影质量进行优化,比如改进粗糙的阴影边缘,优化大范围场景下的阴影效果,缺乏考虑将透光性物体作为遮挡物的阴影结果。具体到云影分析中,云团作为一类可以透光的物体,不同的云团厚度决定云的透光性,进而影响受云团遮挡的地表区域的阴影明暗程度。因此,在云的阴影分析中考虑云的厚度、密度等因素,能够进一步优化阴影分析结果,从而辅助衡量短期内的太阳辐射强度变化,提高光伏发电功率计算准确性。


技术实现要素:

[0005]
为克服现有技术的不足,本发明旨在提出一种顾及积云密度的阴影分析与三维可视化方法。对基于体素构建的三维积云模型应用本发明方法,可以结合太阳光照条件和云密度参数,实现具有不同明暗程度的阴影分析,并在三维地理场景中实现结果可视化。本发明的技术方案包含以下过程,
[0006]
初始化绘制环境,使用opengl创建4个fbo,分别为fbo1、fbo2、fbo3、fbo4,创建二维纹理对象texture1、texture2、texture3用于存储gpu中的计算结果,创建二维纹理对象texture4存储三维积云模型每个体素存储的密度值,初始化视点、光源在wgs84坐标系中的
位置,初始化主相机camera的位置;
[0007]
步骤a1,设当前时刻为t,计算t时刻的太阳位置,记为p
sun
(x
sun
,y
sun
,z
sun
);将太阳光设置为平行光线,标准化的光线方向记为在三维场景中构建以太阳位置p
sun
为原点,光线方向为观察方向的光源坐标系;
[0008]
步骤a2,在p
sun
处对三维积云模型进行深度渲染,得到距离光源最近的场景深度,存储在texture1中;
[0009]
步骤a3,在p
sun
处对三维积云模型的包围盒进行深度渲染,得到离光源最远的深度值,结果存储在texture2中;
[0010]
步骤a4,获取主相机camera的位置和视口方向,在主相机的camera位置处对整个三维场景进行深度渲染,得到三维场景实际的场景深度值,结果存储在texture3;
[0011]
步骤a5,获取存储了基于体素的三维积云模型的体素密度值的二维纹理图texture4,绑定到fbo4中;
[0012]
完成上述操作后,在gpu渲染管线中进行进一步的阴影分析操作;
[0013]
步骤b1,将二维纹理对象texture1、texture2、texture3、texture4传入gpu的片段着色器;
[0014]
步骤b2,分别对texture1、texture2、texture3进行采样,得到采样点纹理坐标和对应的深度值,分别记为a
npc
(u,v,za)、b
npc
(u,v,zb)、c
npc
(u,v,d),u、v为采样点纹理坐标,za、zb、d为深度值;
[0015]
步骤b3,判断采样点a
npc
和c
npc
的深度值,若za≥d,该采样点不在被云团遮挡的阴影区域中,跳转至步骤b2获取下一采样点进行深度判断;若za《d,该采样点在阴影中,进入步骤b4;
[0016]
步骤b4,根据a
npc
和b
npc
的纹理坐标和深度值通过矩阵变换分别计算a
npc
、b
npc
的世界坐标,记为a
world
(xa,ya)、b
world
(xb,yb)。在以a
world
为起始点,b
world
为终点的光线上,沿光线方向逐步判断与光线碰撞的体素,采样texture4得到体素对应的密度值ρ,对密度值进行累加得到累积云密度值totalρ;
[0017]
步骤b5,在对所有采样点完成上述步骤后,在gpu的着色渲染管线中遍历所有totalρ,通过比较得到totalρ的最大值,记为totalρ
max
,根据构建阴影颜色的分量c与云密度的关系,在gpu着色渲染管线中对阴影区域的颜色的r、g、b、a分别赋值,将颜色从gpu中输出,实现在三维地理场景中可视化顾及云密度的阴影分析结果。
[0018]
进一步的,步骤a1中,对于光源坐标系的定义如下;
[0019]
光源坐标系定义为以当前时刻的太阳位置为原点,以太阳光线的入射方向为x轴,以地面上垂直于x轴方向为y轴,以垂直地面竖直向上的方向为z轴,为视线方向的平行投影坐标系。
[0020]
进一步的,步骤a1中光线方向
[0021]
步骤a3中,三维积云模型的包围盒是在三维世界坐标系下构建的包围盒,该包围盒的范围满足:
[0022][0023]
其中,(x,y,z)为三维积云模型每个体素的中心点的世界坐标。
[0024]
进一步的,步骤a2中,在光源坐标系下,p
sun
处设置相机camera1,相机视口裁剪方式为背向剔除,相机分别绑定fbo1和深度纹理图texture1。以p
sun
为原点,光线发射方向为观察方向进行场景深度渲染,渲染的目标对象为三维积云模型,得到场景中的积云模型离光源最近的深度值,计算结果渲染输出到fbo1中的texture1;
[0025]
步骤a3中,在光源坐标系下,p
sun
处设置相机camera2,相机视口裁剪方式为前向剔除,相机分别绑定fbo2和深度纹理图texture2。以p
sun
为原点,光线发射方向为观察方向进行场景深度渲染,渲染的目标对象为三维积云模型的包围盒,得到包围盒离光源最远的深度值,计算结果渲染输出到fbo2中的texture2;
[0026]
步骤a4中,获取默认主相机camera的位置,基于主相机camera的位置和视口方向渲染三维场景,相机视口裁剪方式为背向剔除,相机分别绑定fbo3和深度纹理图texture3,渲染的目标对象为整个三维场景,得到实际的场景深度值,计算结果渲染输出到fbo3中的texture3。
[0027]
进一步的,步骤b2中,对于相机视口下的三维场景,获得相机坐标系下的顶点坐标数组,记为vertexarray,并传入到gpu的顶点着色器中,通过矩阵变换将vertexarray从相机坐标系下转换到光源坐标系下的纹理数组texturecoord,将texturecoord传入gpu的片段着色器中,根据texturecoord分别对texture1、texture2、texture3进行采样。
[0028]
进一步的,步骤b4中,累积云密度值totalρ的定义和计算如下:
[0029]

设置步进点p=a
world
,步进系数step=l
cloud
,初始化累积密度值totalρ=0;
[0030]

计算在世界坐标系下起点a
world
到终点b
world
的距离,记为d
ab
,d
ab
=|b
world-[0031]aworld
|;
[0032]

计算步进点p到起点的距离,记为d
ap
,d
ap
=|p-a
world
|;
[0033]

比较两点间距离d
ap
和d
ab
的大小,
[0034]
若d
ap
≤d
ab
,对纹理图texture4进行采样,获得采样点纹理坐标和该坐标的纹理值ρ,进入


[0035]
若d
ap
》d
ab
,步进点p到达终点,结束本次循环;
[0036]

通过比较ρ的大小判断步进点p处是否有云体素,
[0037]
若ρ≠0.0,对ρ进行累加,累加值记为totalρ:totalρ=totalρ+ρ,完成后进入


[0038]
若ρ=0.0,该步进点处没有云体素,直接进入


[0039]

步进点p沿光线方向前进:完成后进入

进行循环。
[0040]
进一步的,步骤b5中,在gpu着色渲染管线中对阴影区域的颜色的r、g、b、a分别赋值,r=g=b=c,a=0.7,以a
world
为起始点b
world
为终点的光线到达地表形成的阴影区域颜色color.rgba=(r,g,b,a),最终根据颜色在三维地理场景中输出阴影分析的渲染结果。
[0041]
本发明考虑三维体素积云的密度和厚度信息,基于gpu实现了顾及云密度的阴影分析和三维地理场景中的结果可视化,结合云团参数和太阳光入射方向,在三维场景中渲染具有不同明暗程度的云阴影区域。本发现解决了现有发明无法根据透光物体的透光程度
渲染相应阴影的问题,在三维场景漫游浏览中也表现出良好的系统流畅度。
附图说明
[0042]
图1为本发明实施例的三维积云模型的包围盒示意图。
[0043]
图2为本发明实施例的存储云密度值的三维积云模型示意图。
[0044]
图3为本发明实施例的累积云密度值计算的流程图
[0045]
图4为本发明实施例的流程图。
[0046]
图5为本发明实施例的可视化效果图。
具体实施方式
[0047]
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实时方式作进一步的详细描述。
[0048]
相关术语:
[0049]
gpu 图形处理器
[0050]
cpu 中央处理器
[0051]
opengl开放图形库,是行业领域中最为广泛接纳的2d/3d图形api fbo帧缓冲区对象
[0052]
实施例采用本发明的方法,采用opengl和glsl着色语言,基于osgearth三维渲染引擎,综合考虑太阳光照参数和三维体素积云模型,在三维地理场景中实现了顾及积云密度的阴影分析和结果可视化。
[0053]
本发明实施例提供的一种顾及积云密度的阴影分析与三维可视化方法包括以下过程:
[0054]
首先,基于osgearth三维绘制引擎初始化绘制环境,设当前时刻为t,在三维地理空间中,构建t时刻下的基于体素的三维积云模型。初始化绘制环境,使用opengl创建4个fbo,分别为fbo1、fbo2、fbo3、fbo4。创建二维纹理对象texture1、texture2、texture3用于存储gpu中的计算结果,创建二维纹理对象texture4存储三维积云模型每个体素存储的密度值。初始化视点、光源在wgs84坐标系中的位置。初始化主相机camera的位置。
[0055]
步骤a1,计算t时刻的太阳位置,记为p
sun
(x
sun
,y
sun
,z
sun
)。将太阳光设置为平行光线,标准化的光线方向记为在三维场景中构建以太阳位置p
sun
为原点,光线方向为观察方向的光源坐标系。在p
sun
处对三维积云体素进行深度渲染,得到距离光源最近的场景深度,存储在texture1中。
[0056]
步骤a2,在cpu中,对三维体素积云模型构建aabb包围盒。在p
sun
处对三维积云模型的包围盒进行深度渲染,得到离光源最远的深度值,结果存储在texture2中。获取主相机camera的位置,在主相机camera位置处对整个三维场景进行深度渲染,得到三维场景实际的场景深度值,结果存储在texture3。
[0057]
步骤a3,将二维纹理对象texture1、texture2、texture3、texture4传入gpu的片段着色器。分别对纹理图进行采样,得到texture1的采样点为a
npc
,该点深度值为za;texture2的采样点a
npc
,该点深度值为zb;texture3的采样点为c
npc
,该点在光源坐标系下的场景深度值记为d。
[0058]
步骤a4,判断采样点a
npc
和c
npc
的深度值,若za≥d,该采样点不在被云团遮挡的阴影区域中,跳转至步骤a3获取下一采样点并进行深度判断。若za《d,该采样点在阴影中,在gpu着色管线中以a
npc
、b
npc
对应的世界坐标系下的a
world
、b
world
为起点和终点,计算该条光线经过的所有云体素并记录体素的密度值ρ,通过累加密度值ρ得到累积密度值totalρ。根据ρ、totalρ决定该采样点所表示的地表区域的的阴影色彩,实现阴影分析和三维地理场景中的可视化。
[0059]
具体实施时,可以采用计算机软件方式实现自动流程运行,提供以上一种顾及云密度的阴影分析与三维可视化方法。
[0060]
为便于参考实施起见,提供实施例具体流程设计如下,参见图4:
[0061]
步骤1,设当前时刻为t,在三维地理空间中初始化世界坐标系,构建t时刻下的基于体素的三维积云模型。初始化默认主相机camera位置,创建二维纹理对象用于存储gpu中的深度计算结果,分别记为texture1、texture2、texture3。创建二维纹理对象texture4存储三维积云模型每个体素存储的密度值。创建4个fbo,分别记为fbo1、fbo2、fbo3、fbo4。计算太阳在该时刻下的世界坐标,记为p
sun
。将太阳光设置为平行光线,计算光线方向,记为
[0062]
本发明定义世界坐标系(如图1所示):
[0063]
世界坐标系中x轴为屏幕的水平方向,指向右侧为正,y轴为垂直于屏幕方向,往里为y轴正方向,z轴为屏幕的竖直方向,向上为z轴的正方向。
[0064]
实施例中,三维积云模型由11个体素组成,如图2所示,体素边长记为l
cloud
,以ρ1-ρ11分别标记每个体素,ρ代表每个体素的云密度值。
[0065]
t时刻的太阳位置为p
sun
(x
sun
,y
sun
,z
sun
),光线方向
[0066]
具体实施时,可以根据实际情况定义组成积云的体素个数、体素边长以及每个体素的云密度值。
[0067]
步骤2,在光源坐标系下,p
sun
处设置相机camera1,相机视口裁剪方式为背向剔除,相机camera1分别绑定fbo1和深度纹理图texture1。以p
sun
为原点,光线发射方向为观察方向进行场景深度渲染,渲染的目标对象为三维积云模型,得到场景中的积云模型离光源最近的深度值,计算结果渲染输出到fbo1中的texture1;
[0068]
具体实施时,可以根据实际情况由太阳位置和光线方向确定光源坐标系,在该坐标系下对三维积云模型进行深度渲染。
[0069]
步骤3,在光源坐标系下,p
sun
处设置相机camera2,相机视口裁剪方式为前向剔除,相机camera2分别绑定fbo2和深度纹理图texture2。以p
sun
为原点,光线发射方向进行场景深度渲染,渲染的目标对象为三维积云模型的包围盒,得到包围盒离光源最远的深度值,计算结果渲染输出到fbo2中的texture2。
[0070]
实施例中具体实现如下:
[0071]

首先在世界坐标系下构建三维积云模型的aabb包围盒,如图1所示,该包围盒的范围满足:
[0072][0073]
其中,(x,y,z)为三维积云模型每个体素的中心点的世界坐标。
[0074]

在p
sun
(x
sun
,y
sun
,z
sun
)处设置相机camera2,设置相机视口裁剪方式为前向剔除,相机分别绑定fbo2和深度纹理图texture2。
[0075]

在光源坐标系下,以p
sun
为原点,光线发射方向为观察方向进行场景深度渲染,渲染的目标对象为三维积云模型的包围盒,得到包围盒离光源最远的深度值,计算结果渲染输出到fbo2中的texture2;
[0076]
具体实施时,可以根据实际情况由太阳位置和光线方向确定光源坐标系,在该坐标系下对包围盒进行深度渲染。
[0077]
步骤4,获取渲染当前三维场景的默认相机camera的位置,基于主相机camera的位置和视口方向渲染三维场景,相机视口裁剪方式为背向剔除,主相机camera分别绑定fbo3和深度纹理图texture3,渲染的目标对象为整个三维场景,得到实际的场景深度值,计算结果渲染输出到fbo3中的texture3;
[0078]
实施例中具体实现如下:
[0079]
获取默认主相机camera在世界坐标系下的位置和视口方向等相机参数。以主相机camera的位置为原点,相机视线方向为观察方向对整个三维场景进行深度渲染,设置相机视口裁剪方式为背向剔除,得到实际的场景深度值,计算结果渲染输出到fbo3中的texture3。
[0080]
具体实施时,可以根据实际情况确定主相机的位置和视线方向,进行场景的深度渲染。
[0081]
步骤5,获取存储了基于体素的三维积云模型的体素密度值的二维纹理图texture4,绑定到fbo4中。
[0082]
完成上述操作后,在gpu渲染管线中进行进一步的阴影分析操作。
[0083]
步骤6,将texture1、texture2、texture3、texture4传入gpu的片段着色器中。分别对texture1、texture2、texture3进行采样,得到采样点纹理坐标和对应的深度值,对深度值进行判断,确定采样点是否在阴影中以进行下一步的分析。
[0084]
实施例中具体实现如下:
[0085]

对于主相机视口下的三维场景,获得相机坐标系下的顶点坐标数组,记为vertexarray,并传入到gpu的顶点着色器中。通过矩阵变换将vertexarray从相机坐标系下转换到光源坐标系下的纹理坐标数组texturecoord,将texturecoord传入gpu的片段着色器中。
[0086]

将texture1、texture2、texture3、texture4传入gpu的片段着色器中。根据texturecoord分别对texture1、texture2、texture3进行采样,得到采样点纹理坐标和对应的深度值,分别记为a
npc
(u,v,za)、b
npc
(u,v,zb)、c
npc
(u,v,d)。
[0087]

比较采样点a
npc
和b
npc
的深度值,
[0088]
若za《d,进入步骤7,
[0089]
若za≥d,释放该采样点。如果当前为最后一个采样点,则进入步骤8,否则进入步
骤6的

,获取下一个采样点。
[0090]
具体实施时,可以根据实际情况对纹理图进行采样获得深度值并进行深度值判断,从而决定采样点是否进入下一步骤。
[0091]
步骤7,根据a
npc
和b
npc
的纹理坐标和深度值通过矩阵变换分别计算a
npc
、b
npc
的世界坐标,记为a
world
(xa,ya)、b
world
(xb,yb)。以a
world
为起始点,b
world
为终点,沿光线方向逐步判断与光线碰撞的体素,采样texture4得到体素对应的密度值ρ,对密度值进行累加得到累积云密度值totalρ。
[0092]
本发明提出,如图3,沿光线逐体素计算累积云密度totalρ的方法为,
[0093]

设置步进点p=a
world
,步进系数step=l
cloud
,初始化累积密度值totalρ=0。
[0094]

计算在世界坐标系下起点a
world
到终点b
world
的距离,记为d
ab
,d
ab
=|b
world-a
world
|。
[0095]

计算步进点p到起点的距离,记为d
ap
,d
ap
=|p-a
world
|。
[0096]

比较两点间距离d
ap
和d
ab
的大小,
[0097]
若d
ap
≤d
ab
,对纹理图texture4进行采样,获得采样点纹理坐标和该坐标的纹理值ρ,进入


[0098]
若d
ap
》d
ab
,步进点p到达终点,结束本次循环。
[0099]

判断ρ值,确定该点是否有云体素,
[0100]
若ρ≠0.0,对ρ进行累积密度值计算:totalρ=totalρ+ρ,完成后进入


[0101]
若ρ=0.0,该步进点处没有云体素,直接进入


[0102]

步进点p沿光线方向前进:完成后进入

进行循环。
[0103]
本实施例中,取step=l
cloud
=50,从起始点a
world
到终点b
world
共步进了6次,在步进过程中与云体素求交获得的云体素密度分别取ρ3=0.1,ρ5=0.4,ρ6=0.5,ρ9=0.2。结束步进后,这条光线上的累积体素密度为totalρ=ρ1+ρ2+ρ3+ρ4+ρ5=1.2。
[0104]
步骤8,在对所有采样点完成上述步骤后,在gpu的着色渲染管线中遍历所有totalρ,通过比较得到totalρ的最大值,记为totalρ
max
,根据构建阴影颜色的分量c与云密度的关系。在gpu着色渲染管线中对阴影区域的颜色的r、g、b、a分别赋值,将颜色从gpu中输出,实现在三维地理场景中可视化顾及云密度的阴影分析结果。
[0105]
实施例中具体实现如下:
[0106]
本实施例中,取totalρ
max
=1.5,则阴影颜色的分量c=0.2。在gpu着色渲染管线中对阴影区域的颜色的r、g、b、a分别赋值,r=g=b=c,a=0.7。以a
world
为起始点b
world
为终点的光线方向上的阴影区域的颜色color.rgba=(0.2,0.2,0.2,0.7),最终根据颜色在三维地理场景中输出阴影分析的渲染结果。
[0107]
当顾及云密度的阴影分析与三维可视化结束时,删除fbo,fbo2,fbo3,删除纹理对象texture1、texture2、texture3。在三维地理场景中的阴影分析结果可视化效果如图5所示。
[0108]
通过以上具体实施可以看出,基于gpu实现顾及云密度的阴影分析与三维可视化,能够计算光线到达地面前需要穿过的云体素密度,从而在地表形成具有明暗程度的阴影区域。虽然算法程度有一定的增加,但是基于gpu渲染管线和fbo技术,能够在三维地理场景中
实现逼真的阴影效果和可视化。
[0109]
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1