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


本文标签: 管线 显示 进行