http://www.paper.edu.cn
基于OSG的三维河流的可视化研究
—以长江澄通河段为例
刘现锋
1 ,王船海
1.河海大学水文水资源学院,南京(210098)
1 ,唐海涛
2 ,孙奇
3 ,张文静
1
2.华东勘测设计研究院,杭州 (310014)
3.余姚市水利局,浙江余姚 (315400)
E-mail: liuxianfeng83511@163.com
摘 要:本文以长江澄通河段为研究对象,在 Visual C++平台上,以三维图形开发应用库
Open Scene Graph (简称 OSG)为基础,实现三维河流的可视化。本文所实现的三维河流的
可视化不仅仅是河面和河床的三维可视化,河面和河床之间的内部水体的也以六层三维网格
的形式展现出来了。当后台的数学模型开始计算后,河流也开始动态地流动,达到计算和显
示同步进行的目的。同时可以方便地对河流的实时信息进行查询,比如当前 U 方向流速、V
方向流速、W 方向流速等信息。这样,人们可以直观地看到河道中水流的变化情况。通过系
统的运行表明,该系统能逼真地显示河流的三维动态变化,取得了较好的效果。
关键词:OSG; 三维河流; 可视化; 长江澄通河段
中图分类号:P33
1.引言
水流的实际运动呈现的是三维形态,要全面如实地反映水流的真实特性,必须用三维的
形式来模拟水流的运动[1] 。近三十年来,三维水流数学模型的研究取得了显著进展,已经
逐渐成为了研究水流实际运动状态的强有力工具[1]。但是这些模型的计算结果大多以文件形
式来表示,文件中依次包含了各网格点的 U、V、W 流速等信息。显然这种数字表达不够直
观,本文利用 Visual C++平台,在 Open Scene Graph(简称 OSG)基础上对河道三维水流数
学模型的计算结果进行动态显示,以更好的展示河流的运动过程,实现水流的动态流动,使
人们更直观的看到河道中水流的变化,使得水流信息得以更直观的表达。
目前关于河流可视化的研究大多是河流河面的三维可视化,没有表现河流内部的动态变
化。本文不仅仅实现了河流河面的三维表达,其内部形态也能够展现出来。
关于三维河流的可视化的研究,G.Drogue 等人[2](2002)利用 ArcView 的可视化工具对水
文过程进行了三维可视化研究,他们表现的是线状河川径流的三维动态变化。Bo Huang 等
人[3](2002)采用 ArcView 的宏语言 Avenue 编程,把水文模型 TOPMODEL 和地理信息系
统的可视化和空间分析功能集成起来(AVTOP),能够显示三维地形,但河流的可视化停留在
三维河面上。袁艳斌等人[4](2002)以 Visual C++为系统开发平台,结合 GIS 和 OpenGL 技
术模拟了流域洪水的三维演进过程,其表现的是水面的三维可视化。陈鹏霄[5](2004)等人
应用 3DMAX 的插件 Realflow 和 Realwave 来实现水流的仿真,仿真的仍是河流河面的情景,
未对河流内部的状况进行表达。罗维佳等人[6](2005)以 Visual C++6.0 调用 OpenGL 函数
对流域空间水文过程三维可视化进行了研究,其研究的可视化是流域径流表面的可视化,其内
部状态没有表现出来;另外其空间水文过程和水文模型计算是分离的,以文件形式来达到数
据通讯,未能实现水文过程真正意义上的实时动态显示。唐海涛[7](2008)对二维河网计算模
型的结果数据进行了动态显示, 在 Visual C++开发平台上,以三维图形开发应用库 Open
Scene Graph 为基础,来构建三维场景,显示的仍然是河流河面的三维形态。
- 1 -
http://www.paper.edu.cn
2.研究区域概况
本文选取长江澄通河段,作为研究区域。该区域属于长江河道下游河段(如图 1 所示),
澄通段上起江阴黄田港,下至常熟徐六泾,由福姜沙水道、如皋沙水道、通洲沙水道、狼山
沙水道及徐六泾节点段等组成。该段河道形状呈“Z”字型(如图 2 所示),属于多汊型河
段,河道内沙洲密布,水流结构复杂。该河段主要特点是江面宽窄相差悬殊,鹅鼻嘴节点处
江面宽仅 1.4 公里左右,狼山沙水道处河床宽度达 10 公里左右,至徐六泾又缩窄为 5~6 公
里。该段河道两岸为广阔的冲积平原,地势低平,是粮棉油的重要产区。该河段处于经济高
度发达地区,辖区两岸大中型企业林立,有江阴港等 5 大港口,有万吨级深水码头 38 座,
吞吐量约 4700 万吨,是长江流域经济最发达地区[8-10]。
图 1 长江澄通河段地理位置示意图
Fig.1 Location of Yangtze River ChengTong Reach
图 2 长江澄通河段形状示意图
Fig.2 Sketch of Yangtze River ChengTong Reach
- 2 -
http://www.paper.edu.cn
3.Open Scene Graph 简介
Open Scene Graph (以下简称 OSG)是一款高效实时的三维图形开发包,OSG 构建于
OpenGL 图形函数库之上,全部采用标准 C++语言开发,主要应用于游戏、虚拟现实和科学
计算可视化与仿真领域的高性能图形程序的开发[11]。
OSG 包含了一系列的开源图形库,主要为图形图像应用程序的开发提供场景管理和图
形渲染优化的功能[12]。它采用自顶向下的树状结构的场景图来管理和组织空间数据集。场
景图大量定义的节点类型及其内部的空间组织结构能力,使传统的底层渲染 API 无法实现
的数据存储特性得到了实现,提高了渲染的效率。
根节点
地形节点
河流节点
图 3 场景图形示例
场景图形树结构的顶部是一个根节点。从根节点向下延伸,各个组节点中均包含了几
Fig.3 A sample of scene graph
何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以有零个或多个子成
员。在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。图 3 描述了
一个简单的场景图形,根节点包含地形节点和河流节点,分别对应地形和河流模型。
4. 理论及方法
本文采用成熟的河道三维水流数学模型[1]作为系统的后台计算模型。该数学模型在平面
上采用正交曲线拟合坐标,在垂向上采用无量纲变换,模型的节点变量布置采用交错网格布
置。如图 4-6 所示。
- 3 -
http://www.paper.edu.cn
图 4 ξ η− 平面节点布置图
Fig.4 Layout of ξ η− node
图 5 σ ξ− 平面节点布置图
Fig.5 Layout of σ ξ− node
图 6 σ η− 平面节点布置图
Fig.6 Layout of σ η− node
- 4 -
http://www.paper.edu.cn
该数学模型原来的计算结果就是以文件形式来表示的,文件中依次包含了各网格点的
U、V、W 流速等信息。本文的主要工作就是把这些数据生动的展现出来,不仅仅实现河流
水面的三维表达,其内部形态也要能够展现出来。另外一点值得注意的是,数学模型的结果
是直接显示的,即结果数据不再输出到文件中,再从文件中读取数据来显示,而是计算和显
示同步进行,达到一边计算一边演示的效果,真正意义上实现实时动态显示。
研究思路,首先是地形的构建,构造河流的地理环境;其次是初始河流的构建,即后台
数学模型没有开始计算时的河流;最后是流动的河流,即开始计算后河流的演示及其信息查
询。在 Visual C++平台上,以 OSG2.2 版本为基础,进行开发。难点是河流的构建,我们知
道河流包括河床、河面及其内部水体。本文把河床和河面之间的水体分为六层,通过这六层
河层来组成河流的内部水体。从而由河床、六层河层、河面来组成三维河流。当然也可以把
河床和河面之间的水体分为其他层数,本文采用的是六层。
在 OSG 中构造一个根节点,其包括两个子节点,一是地形节点,二是河流节点。河流
节点又包括三个子节点:河床节点、六层河层节点、河面节点(如图 7 所示)。
根节点
地形节点
河流节点
河床节点
六层河层节点
河面节点
图 7 OSG 的树状数据结构
Fig.7 Dendriform data structure of OSG
4.1 三维地形的构建
选取包含长江澄通河段的数字高程模型(DEM)数据,经 ArcGIS 软件处理成规则格
网类型的 DEM,并输出到文本格式的文件中去,利用 osg::HeightField 类来构造地形,如图
8 所示。贴上该地区的遥感图片,则更加逼真,如图 3 中地形所示。
- 5 -
http://www.paper.edu.cn
图 8 长江澄通河段地形
Fig8 Terrain of Yangtze River ChengTong Reach
由于 DEM 的分辨率小,研究区域范围大,再加上该区域本身比较平坦,为平原地区,
所以构造的地形起伏不大。看上去像平面一样,在窗口的西部有些小山包,河床也比较浅,
其他地区就非常平坦了。osg::HeightField 类是地形类,专门用来构建地形,只需给定单元格
大小、左下角坐标、格网点高程值即可构建出地形。
4.2 初始河流的构建
初始河流的构建包括河床、六层河层以及河面的构建。
4.2.1 河床的构建
裁取河道的 DEM 数据,经过河海大学研制的“数字流域”系统处理成只包含 X、Y、Z
坐标的文本文件。这次不用 osg::HeightField 类,而用 OSG 提供的多边形绘图命令,利用这
些 简单 图元 的绘 制函 数绘 制多 个三 角形 或四 边形 来近 似模 拟河 床。 定义 图元 的类型
osg::PrimitiveSet::QUAD_STRIP,即四边形条带的形式。把 DEM 数据点按顺序读到河床的
顶点数组中去,即依次输入相邻的两排 DEM 数据点的三维坐标便构成一个四边形条带,多
个相邻的四边形条带便构成了河床的空间模型,如图 9 所示。这样可以体现河道弯曲形状,
如图 10 所示。如果用 osg::HeightField 类,则构造成一个矩形区域的地形,无法显示河流的
弯曲特点。
- 6 -
http://www.paper.edu.cn
图 9 用 OSG 的四边形条带来构图
Fig8 Use QUAD_STRIP of OSG
图 10 河床的整体图
Fig10 The whole river bed
4.2.2 六层河层的构建
在河道数学模型的计算网格中(如图 4~6 所示),选取三维水位节点下方的压强节点
(如图 5、6 中的红点)作为河层的节点,其他信息诸如 U 方向流速、V 方向流速、W 方向
流速等则附加在该节点上。这些压强节点的坐标可以从对应的 DEM 数据中获取,而垂向的
高程值为河面的水位值和河床高程值之间的插值。因为采用交错网格,压强节点的数目比河
床规则格网 DEM 的高程点的数目少一半。我们采用一层一层构建的方法,来组织河流。原
理 与 构 建 河 床 相 同 , 为 了 与 计 算 网 格 类 似 , 我 们 采 用 四 边 形 条 带 osg::PrimitiveSe-
t::QUAD_STRIP 图元类型来模拟河层,如图 11 所示。
- 7 -
http://www.paper.edu.cn
图 11 六层河层局部
我们在构造初始河流时后台的数学模型尚未开始计算,因而河流的水位是未知的。我们
Fig.11 Six-storey river section
暂时采用河床一侧的岸边的高程值作为初始水面的水位值,通过与河床高程值的插值来构建
初始河流的内部六层河层。
4.2.3 河面的构建
最后河流水面的的构造。实际在计算开始后由于河面水位值的变化,对应的节点的垂向
值也随之变化,从河流的侧面看比较明显,但是从河流的上面看便不明显了。为此给该河流
加一个流动的河面。OSG 已经和着色语言结合起来,采用着色语言的方式来表现河面,实
现水流的动态模拟,如图 12 所示。同样们暂时采用河床一侧的岸边的高程值作为初始水面
的水位值,来构建初始河流的河面。因而河道中的江心洲、露滩则未显示出来,等开始计算
后随着水位值的更新而逐渐显示出来。
图 12 基于着色语言的河面
Fig.12 River surface based on Shading language
- 8 -