三维GIS中大地球面可视区域计算
2018-07-20于莉莉苏晓光张磊
于莉莉 苏晓光 张磊
摘要:视景裁剪一直是加速图形绘制的重要手段。一种方法是将场景组织成场景图,让视景体与场景图节点包围体层次结构进行求交测试,剔除不相交的节点;另一种方法是直接计算视野范围,根据所得范围选择要显示的对象进行绘制。对三维GIS可视化中的矢量绘制来说,第二种方法是比较合适的。本文基于第二种方法,针对平面大地与球面大地分别提出了一个精确、快速的视野计算方法,有效地提高了GIS数据的渲染速度。
关键词: 视景裁剪;场景图;地理信息系统;可视化
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)13-0260-03
Calculation of the Visible Region of the Large Earth Surface in Three DimensionaL GIS
YU Li-li, SU Xiao-guang*, ZHANG Lei
(Information and Electronic Technology Institute,Jiamusi University, Jiamusi 154007, China)
Frustum culling is always an important method to accelerate graphic drawing. One method is first organizing geomtry objects into a scene graph, then removing the nodes that is not intersectant between the visible area and the hiberarchy of bounding volume of nodes of scene graph. Another method is first calculating the rang of visible area directly, then drawing the objects that is in the rang. For vector data visualization in 3D of GIS ,the second method is more suitable. This article,based on the second method,present respectively an accurate, rapid calculating method of visible area aim at flat land and spherical land, effectively improve the rendering speed of GIS data.
Key words: frustum culling; scene graph; GIS; visualization
在三維场景绘制中,OpenGL等底层API提供的面片级视景裁剪并不能减轻渲染流水线的负担。因此大多数三维应用都是让场景图(Scene Graph)来管理场景中的对象及属性,进而提供对象级别的视景裁剪,来达到对大规模场景的实时渲染。在三维GIS中,视景裁剪也是实现对大规模地形实时渲染的关键技术之一。本文针对GIS数据的快速三维可视化,提出了球面大地可视区域的快速、精确算法,使得在球面上高效绘制矢量数据非常方便。
1 定义域和值域
虽然可以通过一些关键点来表示球面可视区域的边界,但这些关键点仍需要代数方法求解。由于整个场景就是一个地球,我们把它摆放在世界坐标系的原点,北极朝向Z轴,X轴穿过本初子午线。这样,整个球面方程简化成x2 + y2 +z2 = R2。但是一个完美的摄像机应该可以摆放在空间中的任何位置,朝向也是随意的。这导致视锥体的四个侧面方程难以求解。因此,我们用坐标变换把整个场景转到视坐标系中,来简化视锥体侧面的求解与表示。如图1所示(红、绿、蓝三条线分别代表X,Y,Z三轴)。
这时每个侧面都过原点,方程都有aX+bY+cZ = 0的形式,而且a,b,c三者必有一个为0。以这种形式与球面方程||P – O0|| = R联立计算,仍然会在边界点的确定上碰到麻烦,因为在视坐标系中地球成了可以任意摆放的对象。
现在考虑用球坐标系。
为了方便,我们把球坐标系的起始位置放在视坐标系的-z轴上。横向变量角为[α],以-z轴为起始,绕+y轴旋转,逆时针为正;纵向变量角为[φ],也是以-z轴为起始,绕+x轴旋转,逆时针为正。那么 视锥体的定义域为:
([-hFov≤α≤hFov],[-vFovy≤φ≤vFovy]),
值域为[near≤ρ≤far ],其中near和far分别是近裁剪面与远裁剪面的值。
地球的定义域是一个圆E,它的边界正好对应着那一圈“地平线”。这个定义域圆的半径Re即是前面图中紫色圆锥顶角的一半。
Re=arcsin(RG/D),其中RG为地球半径,D为视点到地球球心的距离
圆心坐标用([αe,φe])来表示,它的求解要复杂一点。先回到视直角坐标系,设地球球心在视坐标系下的坐标为(xe, ye ,ze),根据摄像机的姿态可以得到世界坐标系到视坐标系的转换矩阵
M = [sxux-fxpxsyuy-fypyszuz-fzpz0001],
其中向量u为向上方向,f是视线朝向,s由[f×u]得到,(Px,Py,Pz)为视点位置。
在世界坐标系中地球球心的齐次坐标为(0,0,0,1),在视坐标系中变为
(xe, ye ,ze,1)T = M-1*(0,0,0,1)T
下面计算([αe,φe])。
若xe>0则[αG]= arccos([zex2e+z2e]),否則[αG]= 2[π] - arccos([zex2e+z2e]),其中[αG]是从+z轴绕+y轴逆时针旋转到达球心位置时所走过的角度。但[αG]不是我们想要的[αe],因为我们的球坐标系是以-z轴为起始线的,所以它们俩相差一个[π]。即:
[αe]= [αG] - [π]。
[φe]的求解比较简单,公式为:
[φe] = arcsin(ye/D)。
至此,定义域全部求解完毕。
显然,地球与视锥体相交等价于它们的定义域相交。定义域的交线正好对应空间中那条复杂的可视区域边界线。
在得到定义域中矩形和圆的交线后,进行采样,得到一系列采样点。因为是球面坐标系的定义域,所以这些采样点对应一系列从原点出发的射线。这时就可以回到直角坐标系,让它们与球面相交,交点即是视空间中可视区域边界线的关键点。然后把这些关键点转到世界坐标,再转成地理坐标,最后就得到地理范畴中的可视区域多边形。
2 两个定义域的求交与采样
如图2所示,矩形ABCD为视锥体在球面坐标系的定义域;圆E为地球的定义域;F、G为圆与矩形的交点;没有字母的点即为我们的采样点。很明显,环BCFG是我们所需要的东西。
由于采样和求交是密不可分的,不同的采样策略可能会导致不同的求交算法。一种策略如图所示,在矩形的每条边上等距取四个点,在圆E与矩形的相交弧上,以固定度数为一个间隔定义一系列的点。有些点如A和D将落在相交环的外面,必须被屏蔽掉。
现在考虑求解矩形和圆的相交环。一种方法是先把圆采样成一个近似多边形,再用图形学中成熟的多边形裁剪算法与矩形求交。因为我们已经把矩形放到一个相当有利的位置,所以采用解析几何的方法会更加快速和精确。先把交点求出,然后再从相交弧上采样。
具体的求交算法这里不再阐述,主要思路是先进行矩形和圆的相交判断,然后再求矩形每一条边与圆的交点,最后把交点存在一个顺序表中。
3 在视直角坐标系中计算可视区域边界的关键点。
有了定义域相交环,可以很容易地求出环上每一个点在视三维空间中的对应点,后者构成视直角坐标系中的可视区域边界。
环上每一个点对应一条从原点出发的射线,用参数方程:
x = t cos[φ]sin[α]
y = t sin[φ]
z = t cos[φ]cos[α]
来表示它(时刻记住y轴为向上方向)。
然后,与地球球面方程:
(x – xe)2 + (y – ye)2 + (z – ze)2 = R2
联立,得到一个有效根,然后根据t求得x,y,z,它就是视直角坐标系中的可视区域边界上的一个关键点。把所有关键点求出,最后就可得到视坐标系中的可视区域边界多边形。
4 转换到世界坐标系
设一个点在视坐标系的齐次坐标为(xv,yv,zv,1)T,那么它在世界坐标系下的齐次坐标:
(x,y,z,1)T = M*(xv,yv,zv,1)T
这一步还要考虑一个问题,就是极点处于边界多边形之内时,需要让极点作为一个顶点加入多边形中。否则将会导致下一步生成的经纬坐标多边形不准确。
5 把世界坐标转成经纬度坐标
设(L,B,H)为(x,y,z)对应的经纬度坐标,则:
L = [arccos(x/x2+y2)] ,若y<0,则L取相反数。
B = [arcsin(z/R)]
H = 0
此时,用经纬度坐标表示的球面可视区域多边形就得到了。用它可以对现有的地理信息访问引擎进行多边形查询了。
6 结论
以平面视野来代替视景体进行二维裁剪对大范围地形实时漫游提供了很好的支持,可见的那部分地理区域来裁剪GIS数据,把裁剪结果送给渲染流水线进行绘制。
为了降低复杂度,绝大部分的平面裁剪算法都采用了不精确的视野模型。其中一种典型算法是把视野近似成以视点为圆心的扇形。这样做虽然简化了裁剪计算,但在渲染大规模场景时对渲染流水线增加的负担往往更大。因此在这种情况下,在保证低复杂度的前提下,针对平面大地与球状大地分别给出了一种比较精确的平面视野计算方法并对视野进行更加精确的描述是很必要的。
参考文献:
[1]崔庆生. 数字城市中的若干空间分析技术及可视化实现方法研究[J]. 西安电子科技大学学报. 2003
[2]Richard S. Wright, Jr. Michael Sweet. OpenGL Super Bible 2[M], 2000
[3]孙家广. 计算机图形学[M]. 3版.北京:清华大学出版社, 1998
[4]OpenGL performer Programmers guide, www.sgi.com
[5]刘勇奎, 高云, 黄有群. 一个有效的多边形裁剪算法[J]. 软件学报, 2003, 14(4)