基于SceneControl的三维GIS开发
在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一对一的关联关系,关联关系中的二者的生命周期并没有直接联系。
基于SceneControl的三维GIS开发的更多相关文章
- 19个三维GIS软件对比
19个三维GIS软件对比 麦豆科研技术中心 days ago 我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方 ...
- 国内外主流的三维GIS软件
我国GIS经过三十多年的发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求的情况下,三维GIS应运而生,并成为GIS的重要发展方向之一.上世纪八十年代末以来,空间信息三维可视化技术成为业界研 ...
- SuperMap iClient 7C——网络客户端GIS开发平台 产品新特性
SuperMap iClient 7C是空间信息和服务的可视化交互开发平台,是SuperMap服务器系列产品的统一客户端.产品基于统一的架构体系,面向Web端和移动端提供了多种类型的SDK开发包,帮助 ...
- 开源(免费)三维 GIS(地形,游戏)
先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...
- 基于特定领域国土GIS应用框架设计及应用
基于特定领域国土GIS应用框架 设计及应用 何仕国 2012年8月16日 摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...
- 华为HMS Core携手超图为三维GIS注入新动能
6月30日,在2022(第五届)GIS软件技术大会GIS基础软件新技术板块论坛上,华为联合超图推出了基于HMS Core 3D Engine开发的高保真三维GIS插件,通过3D渲染技术助力三维GIS实 ...
- OpenWebGlobe-开源三维GIS初体验(附源码和演示)
1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...
- 基于WebGL的三维的物联网平台技术
参加工作三年了,从一个搞调试的民工进阶为程序员,收获还是有那么一点的.慢慢讲一些. 去年在网上发现了https://hightopo.com/cn-index.html图扑软件的基于WebGL的三维j ...
- [转]基于C#的开源GIS项目介绍之SharpMap篇
我是一个刚毕业的GIS本科毕业生,目前在杭州从事GIS软件应用开发.在项目开发中总感觉自己的编程水平还不够,于是想找些开源GIS小项目来研究研究,借以提高自己的编程能力和项目开发能力.在网上搜了一下“ ...
随机推荐
- win32允许前置窗口
win32允许前置窗口函数 AllowSetForegroundWindow(HWND hWnd) 该函数允许其他窗口调用SetForegroundWindow()(将窗口设为前置窗口),前提是调用A ...
- HttpSession的关键属性和方法
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号:2.这个用户随后的所有请求都应包括这个标识号.服务器会校对这个标识号以判断请求属于哪个se ...
- c++实现扫雷(坐标)
昨天在观察贪食蛇的代码时,看到了有如何实现扫雷的c++代码,觉得挺有趣,今天便又试了一下 #include <ctime> #include <cstdlib> #includ ...
- eclipse zg项目学习
一.基本知识 1.新增测试系统: xx/jsp:用于摆放jsp xx/src:放置java source 2.在项目上,右键,New-Folder,新建xx文件夹. 同样的方法,在xx文件夹上,右键N ...
- seleniumIDE的实践
浏览器:1.Firefox setup35.0.12.安装完成后设置菜单栏---安装完浏览器,鼠标定位在浏览器的状态栏,然后点击鼠标右键,点击勾选菜单栏,这时候就有菜单栏出现了 3.关闭浏览器自动更新 ...
- mysql服务器设置其他电脑访问
解决pc.b想访问pc.a上的mysql而访问不了的问题. 第一步:先在navicat的tools里面选择console 第二步:输入下面的信息: '; 其中wp是登陆数据库的用户名,IP地址是允许访 ...
- 获取RequestMapping注解中的属性
参考:https://www.cnblogs.com/2013jiutian/p/7294053.html @RequestMapping("/value1") @Controll ...
- Java中Generics的使用
1.Java的Generics与C++的Template由于Java的Generics设计在C++的Template之后,因此Java的Generics设计吸取Template的很多经验和教训.首先, ...
- iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,
1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入 import Bugly extension AppDelegate{ /// ...
- win10下zip安装mysql5.7的一些问题
一.MySQL下载地址: http://dev.mysql.com/downloads/mysql/ 我们下载zip版本的 二.解压zip文件 三.复制一份里面的my-default.ini为 ...