在ArcGIS体系中,三维开发包括两种:基于Scene的三维开发和基于Globe的三维开发。
由上图可以看出,两种开发的接口都很相似,掌握了Scene开发会相对容易的过渡到Globe开发中。
正如上图所示,Scene开发常用的接口有IScene、ISceneGraph、ISceneViewer、I3DViewer、ICamera等接口,除此之外IGraphicsLayers3D、I3DProperties也经常使用。
为了能弄明白各个接口之间的关系,我来做一个比喻:我们可以把上述接口映射到一场现场直播的球赛之中,Scene就是球赛本身,要进行足球比赛就得需要球场,SceneGraph就承担起了球场的作用,正是因为有了球场,足球运动员、裁判员、足球才能出现,他们都是以球场为前提才出现的。现在足球比赛就可以进行了,但是要想让在家里的观众能看到比赛实况就得需要对球赛进行现场直播,一般情况下CCTV5的直播都会安排多个摄像组,这是为了便于切换视角,从而可以很方便的让观众看到不同的三维场景,一个摄像组不仅仅包括一台摄像机,还包括至少一个摄像师、电源线等等,所以摄像组和摄像机是不等价的,他们的关系是摄像机是摄像组的重要组成部分,SceneViewer和3DViewer很相似,二者都相当于一个摄像组,而ICamera就相当于该摄像组中的摄像机。
下面介绍一下各个接口的主要功能:
Scene:
Scene之于ArcScene如同Map之于ArcMap。在一个ArcScene中,只有一个Scene对象。Scene是许多图层的集合,与ArcScene中相似的是,在一个SceneControl中只有一个Scene对象。Scene实现了包括IScene、IBasicMap、ITableCollection等在内的诸多接口,其中IScene尤为重要。
IScene主要负责图层的组织管理和选择操作,比如AddLayer、AddLayers、ClearLayers、DeleteLayer、MoveLayer等都属于对图层进行组织管理方面的功能;SelectByShape、SelectFeature、ClearSelection、SelectionCount等都是和选择要素相关的方法属性。IScene中有一个重要属性SceneGraph,该属性是只读属性,返回一个ISceneGraph对象。通过只读的SceneGraph属性,IScene与ISceneGraph实现了组合关系,前者的生命周期决定后者。注意,在这里这种组合关系是一对一的,即一个IScene对象只维护一个ISceneGraph。
SceneGraph:
SceneGraph可以看作是一个三维世界,它负责处理了大部分的三维渲染操作,并且使得绘图更有效率,它.实现了IViewers3D、IDisplay3D、ISceneGraph等接口。
IViewers3D顾名思义,提供了许多对ISceneViewer操作的方法属性,比如IViewers3D.ActiveViewer、IViewers3D.FindViewer、IViewers3D.GetAllViewers、IViewers3D.RegisterViewer、IViewers3D.UnRegisterViewer、IViewers3D.RefreshViewers等都是对ISceneViewer进行的操作。
IDisplay3D接口主要用来进行三维闪烁,比如IDisplay3D.AddFlashFeature、IDisplay3D.FlashFeatures、IDisplay3D.FlashGeometry、IDisplay3D.FlashLocation等都是用来进行三维闪烁的。
ISceneGraph是SceneGraph的一个重要接口,实现了许多IViewers3D的功能,比如ISceneGraph.ActiveViewer、ISceneGraph.FindViewer、ISceneGraph.GetAllViewers、ISceneGraph.RegisterViewer、ISceneGraph.UnRegisterViewer、ISceneGraph.RefreshViewers等;ISceneGraph.Locate和ISceneGraph.LocateMultiple用于进行定位,这是很实用的功能,在三维场景中通过鼠标单击可以确定选中了谁;该接口中还有一些以Set开头进行三维场景参数设置的函数,比如ISceneGraph.SetOwnerShadingMode 、ISceneGraph.SetOwnerLightingOption,当然也有几个相应的Get函数获取三维场景的参数,比如ISceneGraph.GetOwnerTransparency。
SceneViewer与3DViewer:
SceneViewer只实现了ISceneViewer接口,3DViewer只实现了I3DViewer接口,这两个接口非常相似,可以把I3DViewer看作是ISceneViewer的新的版本或者是代替。这两个接口相当于三维视角,比如真实三维世界中的一套套不同的摄像装备,而ICamera则相当于该套摄像装备中的摄像机,摄像机肯定是一套摄像装备中最重要的装置,所以ICamera是ISceneVierer与I3DViewer中最重要的属性。如下图所示:
从上图可以看出,两个接口的属性和方法都非常相似,只是I3DViewer比ISceneViewer多了三个和全屏相关的属性方法,图中用红色标记出,因此可以把I3DViewer看作是功能增强版的ISceneViewer。注意,这两个接口里都有一个Camera的可读写属性,通过该属性实现了ISceneViewer与ICamera的一对一的关联关系以及I3DViewer与ICamerad一对一的关联关系,关联关系中的二者的生命周期并没有直接联系。