http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcObjects开发 >> 正文

ArcOjects 3D开发方法简介

作者:佚名    文章来源:GIS论坛    点击数:    更新时间:2009-8-6
摘要:众所周知,在ArcGIS 3D分析扩展模块中提供了丰富的三维可视化和分析功能:你可以通过不同的视角查看表面数据,对表面数据进行查询,以及对表面数据进行坡度、坡向、视域分析等操作,进行三维动画模拟等等。其中所涉及的3D对象都是ArcObjects的一部分,针对3D的开发,实际上是ArcObjects的开发,所以具体的开发方法有:

一、ArcOjects 3D开发方法简介

众所周知,在ArcGIS 3D分析扩展模块中提供了丰富的三维可视化和分析功能:你可以通过不同的视角查看表面数据,对表面数据进行查询,以及对表面数据进行坡度、坡向、视域分析等操作,进行三维动画模拟等等。其中所涉及的3D对象都是ArcObjects的一部分,针对3D的开发,实际上是ArcObjects的开发,所以具体的开发方法有:

基于ArcScene中内嵌的VBA开发;

通过VB、VC++等兼容COM的开发语言进行开发新的3D组件和功能。

二、基本的3D对象模型

在3D开发中,我们可以用ArcMap对应ArcScene,其中MxDocument对象对应SxDocument对象,Map对象对应着Scene对象,而相对于Display显示对象,在ArcScene中有SceneGraph对象。在对象模型图的顶部是Application对象,从它我们可以执行和应用相关的任务,比如打开文档或者访问和应用相关的其它对象。在VBA中,我们可以直接获得Application对象:

Dim pApp as IApplicaiton

Set pApp = Application

如果你在VB DLL中实现命令和工具,那么在具体实例化这个类时你可以获得和Application对象挂接的钩子(hook):

Implements ICommand

Private m_pApp as esriCore.Iapplication

Private Sub ICommand_OnCreate(ByVal Hook As Object)

Set m_pApp = Hook

End Sub

有了Application对象,你就可以访问它所包含的其它所有对象了。比如可以获得SxDocument对象,而它包含一个Scene对象,Scene对应的SceneGraph对象包含了一个或多个SceneViewer对象,每个SceneViewer对象中有一个Camera对象,它代表了观察点的特性。在Scene对象中可以访问Layer对象和GraphicsLayer3D对象,这两个对象都包含着一个3DProperties对象,用来控制图层中有关三维方面的特性。具体有关对象的特性可以参考联机帮助中对象上提供的接口所属的方法和属性。

三、3D几何模型和定制对象介绍
3D模型可以包括两种:矢量模型和表面模型,表面模型包括TIN和Raster,有关表面模型的创建、数据结构访问和分析在本文中不做介绍。在此只介绍三维矢量模型的生成和访问等。3D矢量模型包括所有含有Z值的几何对象:点、线、面,以及MultiPatch(多片)。其中多片又可以分为:三角条带(Triangle Strip)、三角扇(Triangle Fan)和环(Ring)。

在ArcScene中可以通过二维的点、线、面数据来构建三维模型,通过ArcScene中提供的拉伸功能可以将点要素构建成垂直的线,线要素构建成墙,而多边形要素构建成块,拉伸的值的大小可以是一定常数,也可以是通过要素属性字段中的值计算得出,或者通过数据自身记录的Z值。在ArcObjects中可以通过在Geometry几何对象构建过程中,任意点除了X、Y坐标值,指定坐标Z值来构建三维点、线和面对象;对于多片,则通过构建相应的Multipatch对象,并指定每一个顶点的X、Y和Z值。下面的代码描述了如何由多片来构建一个房子对象,它的房顶由三角扇构建,没有窗户的墙由三角条带构建,带窗户的墙由环构建。

Dim pMultiPatch As esriCore.IMultiPatch

Set pMultiPatch = New MultiPatch

Dim pGeoCol As esriCore.IGeometryCollection

Set pGeoCol = pMultiPatch

Dim pPoints As esriCore.IPointCollection

Dim pPoint As IPoint

‘创建屋顶

Set pPoints = New esriCore.TriangleFan

Set pPoint = New Point

pPoint.PutCoords 5, 4

pPoint.Z = 10

pPoints.AddPoint pPoint

Set pPoint = New Point

pPoint.PutCoords 0, 0

pPoint.Z = 5

pPoints.AddPoint pPoint

‘屋顶的其它顶点:

. . . (10, 0, 5); (10, 8, 5); ( 0, 8, 5); ( 0, 0, 5)

‘将扇加到MultiPatch

pGeoCol.AddGeometry pPoints

‘为没有窗户的墙创建条带

Set pPoints = New esriCore.TriangleStrip

‘添加条带顶点:

. . . (10, 0, 5); (10, 0, 0); (10, 8, 5)

. . . (10, 8, 0); ( 0, 8, 5); ( 0, 8, 0)

. . . ( 0, 0, 5); ( 0, 0, 0)

‘将条带添加到MultiPatch

pGeoCol.AddGeometry pPoints

‘为前面的墙创建外环

Set pPoints = New esriCore.Ring

‘添加外环顶点:

. . . (10, 0, 5); (10, 0, 0); (10, 8, 5)

. . . (10, 8, 0); ( 0, 8, 5); ( 0, 8, 0)

. . . ( 0, 0, 5); ( 0, 0, 0)

‘将外环添加到MultiPatch

pGeoCol.AddGeometry pPoints

pMultiPatch.PutRingType pPoints, esriMultiPatchOuterRing

‘为前面的墙创建内环

Set pPoints = New esriCore.Ring

‘添加内环顶点:

. . .(1, 0, 2);(3, 0, 2);(3, 0, 4);(1, 0, 4);(1, 0, 2)

pGeoCol.AddGeometry pPoints

pMultiPatch.PutRingType pPoints, esriMultiPatchInnerRing

Set pPoints = New esriCore.Ring

‘添加内环顶点:

. . .(7, 0, 2);(9, 0, 2);(9, 0, 4);(7, 0, 4);(7, 0, 2)

pGeoCol.AddGeometry pPoints

pMultiPatch.PutRingType pPoints, esriMultiPatchInnerRing

‘设置Z和M坐标awareness

Dim pZAware As esriCore.IZAware

Set pZAware = pMultiPatch

pZAware.ZAware = True

Dim pMAware As esriCore.IMAware

Set pMAware = pMultiPatch

pMAware.MAware = False

通常,多片是用来描述阴影平面集合,并且可以在其上粘贴影像,也就是贴图。为了粘贴影像,需要在Multipatch的每一个定点上记录纹理坐标。纹理坐标记录为s和t,值为0到1,表示了从x到y方向影像的起点到终点。在ArcObjects中将s和t编码存储在定点的M值中。另外,如果要用Multipatch表达复杂连续的几何对象,比如球体,为了平滑阴影平面之间的转折,需要在Multipatch的每一个顶点上记录它的法向量,同样法向量也是编码后存储在定点的M值中。如下面的代码:

Dim pNormal As esriCore.IVector3D

Dim pVertex As esriCore.Ipoint

Dim m As Double

m = 0

. . .

Dim pEncoder As IEncode3DProperties

Set pEncoder = New GeometryEnvironment

pEncoder.PackNormal vNormal, m

pEncoder.PackTexture2D s, t, m

pVertex.M = m

四、3D渲染和动画功能定制简介

在ArcObjects中的3D对象内部调用了OpenGL图形库,所以有关3D渲染方面的开发是基于OpenGL图形库方面的知识。在ArcObjects中的定制渲染工作原理如下图,在SceneGraph::Redraw绘制开始和结束时分别会激活SceneGraph或其它外部事件处理器的OnBeforeDraw和OnAfterDraw事件,我们可以在这两个事件添加自己的渲染效果,比如在OnBeforeDraw事件中添加雾化效果等,而可以在OnAfterDraw事件中添加三维文字标注等。

动画使得场景有动态的感觉,我们可以通过对视角、图层的可见性、以及场景的属性进行定制来达到动画的效果。下图是在动画定制中将会涉及到的部分类和接口。

从此对象模型图我们可以看出在Scene对象中可以访问动画轨迹对象(AnimationTrack),而动画轨迹是由关键帧组成的,关键帧分成场景的、图层的和书签(照相机)的。同时动画类型也分为场景、图层和照相机三种。这些类都是CoClass,可以通过创建的方式实例化,从而来控制动画的定制。另外,在ArcObjects中提供了控制动画演播和录制的相应方法,具体参考帮助文档中AnimationTrack类和ScreenViewer类。

五、三维控件

在ArcObjects中包含一个ActiveX viewer控件,它为ActiveX控件容器如Microsoft Word、Microsoft PowerPoint等提供了显示三维文档、图层及图形数据的功能。下面的代码显示了如何在VB中使用此控件:

‘ 引用ArcScene文档

SceneViewerCtrl1.DocName = “c:\temp\myscene.sxd”

或者

‘ 添加一个图层

SceneViewerCtrl.SceneGraph.Scene.AddLayer pLayer

或者

‘添加一个图形元素

Dim pMap As IBasicMap

Set pMap = SceneViewerCtrl1.SceneGraph.Scene

Dim pGCon As IGraphicsContainer3D

Set pGCon = pMap.BasicGraphicsLayer

Set pGCon = pGLayer

pGCon.AddElement pElement

Viewer.Redraw False  

六、总结

本文旨在对ArcObjects?中有关3D的部分做一个简单的介绍,

Tags:ArcOjects,3D  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图