admin 管理员组文章数量: 1087136
2024年3月13日发(作者:温州php后端开发培训)
第
1
期
刘广社等1基于
OpenGL
的管线三维显示方法研究
94
文章编号
:1672-8262
(
2007
)
01-49-03
中图分类号
:P209
文献标识码
:B
基于
OpenGL
的管线三维显示方法研究
刘广社
,
王浩
(
黄河水利职业技术学院
,
河南开封
475004
)
3
摘 要
:
采用
OpenGL
技术中的坐标变换和剪切变换及
VisualC
++
中的
STL,
设计了一种管线三维显示的算法
,
解决了
管线的三维显示问题。
关键词
:OpenGL;
管线
;3DGIS;
坐标变换
;
剪切变换
1
引 言
伴随着城市经济发展水平的提高以及城市现代化
建设的高速发展
,
城市地下管网变得越来越复杂
,
越来
越庞大
,
种类也越来越多
,
这给城市管网信息管理系统
的建设提出了许多新的要求。另一方面
,
计算机软硬
件技术的飞速发展
,
也为高效率、多功能的地理信息系
统的建设提供了必要条件。在这些客观条件下
,
加之
传统的二维
GIS
本质上是基于抽象符号的系统
,
不能
给人以自然界的本原感受
,
于是人们在三维管线信息
系统的研究与开发方面进行了许多尝试。
对于三维管线的直线部分比较容易处理
,
而管线拐
点处的平滑显示则比较棘手。我们可以考虑设计一个以
管线口径和拐角角度大小为参数的函数来生成拐点部分
管线的模型
,
然后根据计算得到的坐标将这个模型显示
在屏幕上。但是
,
这会在管线的显示过程中耗费大量的
时间
,
尤其是随着数据量的增大、拐点数目的增多
,
程序的
运行将会非常缓慢。另一个想法是利用目前流行的三维
建模软件事先设计好圆滑的三维模型
,
然后在需要时进
行读取并显示。这种办法虽然节省了三维模型构造的计
算时间
,
但却失去了灵活性
,
而事实上
,
我们也不可能创建
足够多的模型以满足所有需求。
在这种情况下
,
我们根据
OpenGLAPI
提供的功
能
,
设计了一种能够灵活、快速进行三维管线显示的方
法
,
并进行了实际应用
,
取得了不错的效果。
局部坐标系建立在世界坐标系内部
,
是物体绘制过程
的参考系。由于绘制的需要
,
我们常常需要让局部坐
标系在世界坐标系中进行旋转和平移操作
,
这样便有
了局部坐标和世界坐标之间的变换问题。
)
,
在如图
1,P
点在局部坐标系中的坐标为
(
x
′
,y
′
,z
′
世界坐标系中的坐标为
(
x,y,z
)
。局部坐标系原点在世界
(
x
0
,y
0
,z
0
)
,
局部坐标系的
Z
′
坐标系中的坐标为
O
′
轴和世
界坐标系的
X
、
Y
、
Z
轴的夹角分别为
α
,
β
,
γ
。通过图
2
我
们可以看到
,
假设局部坐标系的原点位于世界坐标系的
原点
,
那么
,
要将世界坐标系变换为局部坐标系
,
需要经过
两次旋转变换
:
先绕
Y
轴转动
ω
角度
,
再绕
Z
轴旋转
φ
角
度。在此基础之上
,
再把坐标进行一次平移变换便可实
现世界坐标系到局部坐标系的变换了。
图
1
局部坐标系与世界坐标系
2
坐标变换基础
在利用
OpenGL
进行程序设计的时候
,
我们一直
在同世界坐标系和局部坐标系打交道。所谓世界坐标
系视点
(
即眼睛所在的位置或者相机的位置
)
位置的
参考系
,
视点的移动将始终在世界坐标系中进行。而
3 收稿日期
:2006
—
04
—
21
作者简介
:
刘广社
(
1960
—
)
,
男
,
讲师
,
从事高校测绘工程专业教学与研究工作。
图
2
局部坐标系与世界坐标系的旋转关系
经过上述分析可知
,
由局部坐标系到世界坐标系
的变换实际上是一个图形组合变换
,
它是由局部坐标
系绕
Y
轴转
ω
、绕
Z
轴转
φ
以及平移至
(
x
0
,y
0
,z
0
)
3
05
城 市 勘 测
2007
年
个变换组成的。由于在
OpenGL
中并不需要开发人员
进行复杂的矩阵运算
,
而只需模拟实际的变换步骤调
用相应的能够实现旋转平移操作的函数进行局部坐标
系的变换
,
因此这里没有详细推导变换矩阵
,
感兴趣的
读者可以自行推导。
线节点的三维坐标来进行管线的屏幕输出。
3
管线的显示效果分类
为了提高程序的运行速度
,
在三维管线信息系统
中
,
我们会根据不同的情况
,
选择让管线显示出不同的
效果。当进行管网的全局显示时
,
我们没有必要让每
条管线都表示成圆滑的曲线。但当用户对整个场景进
行放大
,
并达到一定程度时
,
我们就需要向用户展示管
线的局部细节
,
使用户能够快速准确地掌握真实信息。
根据不同的需要
,
我们把管线的显示分为以下
3
种情况。
(
1
)
全局显示或放大倍数较小时
,
让所有管线以
图
3
类之间的相互关系以及类的结构
数据准备工作做好后
,
进行管线的显示工作。第一
种情况是管线的三维直线显示。这时
,
要对每条管线根
据它们各自的节点数量做若干次循环
,
在每两个管线节
点之间用
OpenGL
函数绘制一条三维直线
,
遍历
PipeList
中的所有的管线后即可实现管线的三维直线显示。
当用户不断地对当前的屏幕显示进行放大时
,
我们
需要判断当前的放大倍数
,
然后在恰当的时候更改管线
的显示方式
,
即上面的讨论中所提到的第二种情况。在
这种情况以及最后一种情况中
,
都需要应用
OpenGL
剪切
变换技术。在
OpenGL
里
,
我们可以定义一个或多个剪切
面
,
其函数为
A
x
+B
y
+C
z
+
d
=0
,
当绘制物体时
,
满足条
件
A
x
+B
y
+C
z
+
d
<0
的部分将被裁剪掉
,
即不可见。需
要注意的是
,
剪切变换受当前的几何变换的影响
,
即剪切
面的定义是相对当前的局部坐标而言的。
首先
,
我们需要以空心圆柱形式表示管线的直线
部分。在
OpenGL
中调用绘制圆柱的函数的结果是一
个指定高度的底面在局部坐标系的
XOY
面上
,
以局部
坐标系的正
Z
轴为对称轴的圆柱。以下假设管线上的
顺次
3
个节点
i
、
i
+1
、
i
+2
。为了绘制节点
i
到节点
i
+1
的圆柱
,
需要对局部坐标系进行变换
,
使得局部坐
三维线的形式进行显示。这样
,
使得管线不仅具有二
维地理信息系统中的平面信息
,
而且能够将高低位置
清楚地反映在屏幕上
,
增强了立体感。
(
2
)
当达到一定放大倍数时
,
管线直线部分以圆滑管
状进行显示
,
而在管线交接处
,
不进行平滑
,
但需要根据管
线的长度
,
切割掉出头部分
,
使得管线交接处以拐角形式
显示。由于管线交接处的平滑显示需要涉及二次曲面的
计算
,
因此即便是
OpenGL
自身进行处理
,
在管线数量增
多的时候也会非常明显的影响程序的运行速度。
(
3
)
在用户需要对管线局部进行详细观察时
,
或
者选择某条管线进行单独显示时
,
将在第二种显示效
果的基础之上
,
用二次曲面对管线交接处进行平滑。
这种情况下的管线显示效果达到最优
,
但也是最耗费
时间的
,
因此只选择在特定的场合下使用。
结合上述
3
种情况
,
我们将在下面详细探讨其实
现过程。
标系的原点位于世界坐标系的
i
点上
,
局部坐标系的
正
Z
轴方向为世界坐标系的
i
→
i
+1
方向。
在处理管线交接处时
,
我们需要适当地延长管线
的直线部分
,
使得
i
→
i
+1
段的圆柱和
i
+1
→
i
+2
段的
圆柱完全相交
,
然后定义一个剪切面
,
这个剪切面位于
直线
i
→
i
+1
和直线
i
+1
→
i
+2
的平分线处
,
且垂直于
点
i
、
i
+1
、
i
+2
所在的平面
,
如图
4
所示
,
其中的粗线
包围部分为最终显示部分。
从图中可以看到
,
设
i
到
i
+1
的向量为
n
1
,i
+1
到
i
+2
的向量为
n
2
,
则剪切面法向量的计算可以通过
点
i
、
i
+1
、
i
+2
所在的平面的法向量与
n
1
+
n
2
叉乘得
到
,
继而可以通过剪切面的法向量计算出剪切面方程。
一个剪切面将同时作用在相邻的两段管线上
,
但剪切
面的方向是不一样的
,
因此在绘制
i
+1
→
i
+2
段管线
时
,
只需对剪切面的
A
、
B
、
C3
个参数取相反数
,
并重
4
管线三维显示的实现
在问题的解决过程中
,
我们首先从数据的组织形
式出发
,
设计了几个数据类
,
以方便功能的实现。图
3
为类之间的相互关系以及每个类的结构图。
从图中我们可以看到
,1
条具有统一属性的管线
(
Pipe
)
由
2
个或
2
个以上的节点
(
PipeNode
)
组成
,PipeList
则用于组织某一区域内某种类型的所有管线集合。在存
储列表数据时
,
我们使用了
MicrosoftVisualC
中的
STL
(
StandardTemplateLibrary
)
。我们为每一条管线都提供
了一个绘制接口
(
Draw
)
,
用于根据存储在类对象中的管
++
第
1
期
刘广社等1基于
OpenGL
的管线三维显示方法研究
15
新计算参数
D
。有第二种情况的基础
,
我们便容易地
联想到第三种情况的解决办法。为了使得管线的交接
部分能平滑显示
,
我们可以在交接处插入一个与管线
相切的圆环柱
,
并利用剪切变换
,
隐藏多余部分
,
如图
5
所示
,
其中的粗线包围部分为最终显示部分。
类似地可以计算出点
A
和点
B
的坐标
,
由切线的性
质可知
n
1
和
n
2
分别为
2
个剪切面的法向量
,
所以根据向
量
n
1
、
n
2
可以推算出
2
个剪切面的方程。由计算所得值
进行坐标变换和剪切变换
,
即可实现在剪切面作用下的
圆滑管线显示。图
6
是
3
种情况下的管线显示效果图。
图
6
3
种不同情况下管线的显示效果
图
4
管线的剪切以及剪切面法向量的计算
4
结 论
通过以上方法
,
较好地解决了管线的三维显示问
题
,
由于本文以解决管线的三维显示问题为主
,
因此在
数据结构的设计方面并未对管线的空间拓扑进行详细
讨论
,
这样就不能满足实际工作中大家在管线空间查
询与分析方面的要求
,
但这是任何一个管线信息管理
系统在设计开发过程中所不能逃避的问题
,
因为只有
完善的数据结构设计才能从根本上保证系统的健壮
性
,
因此
,
我们将在以后的工作中进行不断的努力
,
使
之更加完善
,
最终满足实际的需求。
OpenGL
中调用绘制圆柱环的函数所得结果为一
个指定半径的以当前局部坐标系原点为圆心
,
轴线在
当前局部坐标系
XOY
面上的圆柱环。我们需要计算
出圆柱环的圆心
O
的坐标。
图
5
管线交接处的圆滑及剪切面计算
参考文献
[1]
李响
,
李满春
,
余有胜
.
一个实用的城市地下管网
GIS
数
根据点
i
、
i
+1
、
i
+2
的坐标由下式计算出直线
i
+
1
→
i
和直线
i
+1
→
i
+2
的夹角
α
:
据结构
[J].
遥感信息
,1999,
(
3
)
:15-18.
[2]
肖乐兵
,
钟耳顺
,
刘纪远等
.
三维
GIS
的基本问题探讨
[J].
中国图象图形学报
,2001,
(
9
)
:842-848.
[3]
许社教
.
三维图形系统中两种坐标系之间的坐标变换
[J].
西安电子科技大学学报
,1996,
(
9
)
:429-432.
[4]
向世明
.OpenGL
编程与实例
[M].
北京
:
电子工业出版
α
=acos
((
d
x
1
3
d
x
2
)
+
(
d
y
1
3
d
y
2
)
+
(
d
z
1
3
d
z
2
))
(
其中
:d
x
1
=
x
i
-
x
i+1
,d
x
2
=
x
i+2
-
x
i+1
,d
y
1
=
y
i
-
y
i+1
,d
y
2
=
y
i+2
-
y
i+1
,d
z
1
=
z
i
-
z
i+1
,d
z
2
=
z
i+2
-
z
i+1
)
根据当前管线的情况指定点
A
到点
i
+1
和点
i
+
1
到点
B
之间的距离为
S,
计算出点
i
+1
到圆柱管圆
社
,1999.
[5]
郑淑荣
,
杨国东
.
信息系统中三维管线的显示问题探讨
[J].2003,
(
6
)
:34-35,40.
[6]
杨永国等
.VisualC
++
心
O
之间的距离
d:
d=S/cos
(
α
3
0
1
5
)
计算向量
n
1
、
n
2
以及它们的和向量
n
1
+
n
2
并进行单
位化
,
从
i
+1
的坐标出发即可计算出圆心
O
的坐标。
6
1
0
实用教程
[M].
北京
:
清华大学
出版社
,2005.
ResearchontheWayofPilelineThree-dimensionalDisplayBasedonOpenGL
LiuGuangShe,WangHao
(
YellowRiverConservancyTechnicalInstitute,Kaifeng475004,China
)
Abstract:Thepaperdesignsanalgorithmofpilelinethree-dimensionaldisplaywhichadoptsthecoordinatetrans
2
formationandcuttransformationintheOpenGLtechnologyandSTLintheVisualC
linethree-dimensionaldisplay.
Keywords:OpenGL;pileline;3DGIS;coordinatetransformation;cuttransformation
++
,anditsolvestheproblemofpile
2
版权声明:本文标题:基于OpenGL的管线三维显示方法研究 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710278706a565805.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论