Cesium源码之flyTo(一)
1 /**
2 * Flies the camera from its current position to a new position.
3 *
4 * @param {Object} options Object with the following properties:
5 * @param {Cartesian3|Rectangle} options.destination The final position of the camera in WGS84 (world) coordinates or a rectangle that would be visible from a top-down view.
6 * @param {Object} [options.orientation] An object that contains either direction and up properties or heading, pitch and roll properties. By default, the direction will point
7 * towards the center of the frame in 3D and in the negative z direction in Columbus view. The up direction will point towards local north in 3D and in the positive
8 * y direction in Columbus view. Orientation is not used in 2D when in infinite scrolling mode.
9 * @param {Number} [options.duration] The duration of the flight in seconds. If omitted, Cesium attempts to calculate an ideal duration based on the distance to be traveled by the flight.
10 * @param {Camera.FlightCompleteCallback} [options.complete] The function to execute when the flight is complete.
11 * @param {Camera.FlightCancelledCallback} [options.cancel] The function to execute if the flight is cancelled.
12 * @param {Matrix4} [options.endTransform] Transform matrix representing the reference frame the camera will be in when the flight is completed.
13 * @param {Number} [options.maximumHeight] The maximum height at the peak of the flight.
14 * @param {Number} [options.pitchAdjustHeight] If camera flyes higher than that value, adjust pitch duiring the flight to look down, and keep Earth in viewport.
15 * @param {Number} [options.flyOverLongitude] There are always two ways between 2 points on globe. This option force camera to choose fight direction to fly over that longitude.
16 * @param {Number} [options.flyOverLongitudeWeight] Fly over the lon specifyed via flyOverLongitude only if that way is not longer than short way times flyOverLongitudeWeight.
17 * @param {Boolean} [options.convert] Whether to convert the destination from world coordinates to scene coordinates (only relevant when not using 3D). Defaults to <code>true</code>.
18 * @param {EasingFunction.Callback} [options.easingFunction] Controls how the time is interpolated over the duration of the flight.
19 *
20 * @exception {DeveloperError} If either direction or up is given, then both are required.
21 *
22 * @example
23 * // 1. Fly to a position with a top-down view
24 * viewer.camera.flyTo({
25 * destination : Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
26 * });
27 *
28 * // 2. Fly to a Rectangle with a top-down view
29 * viewer.camera.flyTo({
30 * destination : Cesium.Rectangle.fromDegrees(west, south, east, north)
31 * });
32 *
33 * // 3. Fly to a position with an orientation using unit vectors.
34 * viewer.camera.flyTo({
35 * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
36 * orientation : {
37 * direction : new Cesium.Cartesian3(-0.04231243104240401, -0.20123236049443421, -0.97862924300734),
38 * up : new Cesium.Cartesian3(-0.47934589305293746, -0.8553216253114552, 0.1966022179118339)
39 * }
40 * });
41 *
42 * // 4. Fly to a position with an orientation using heading, pitch and roll.
43 * viewer.camera.flyTo({
44 * destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
45 * orientation : {
46 * heading : Cesium.Math.toRadians(175.0),
47 * pitch : Cesium.Math.toRadians(-35.0),
48 * roll : 0.0
49 * }
50 * });
51 */
52 Camera.prototype.flyTo = function (options) {
53 options = defaultValue(options, defaultValue.EMPTY_OBJECT);
54 var destination = options.destination;
55 //>>includeStart('debug', pragmas.debug);
56
57 //如果没设置目的地报错
58 if (!defined(destination)) {
59 throw new DeveloperError("destination is required.");
60 }
61 //>>includeEnd('debug');
62
63 var mode = this._mode;
64
65 //如果当前scene正在变化中
66 if (mode === SceneMode.MORPHING) {
67 return;
68 }
69
70 this.cancelFlight();
71
72 var orientation = defaultValue(
73 options.orientation,
74 defaultValue.EMPTY_OBJECT
75 );
76
77 //如果定义了方向,则将方向转换为HeadingPitchRoll这种格式
78 if (defined(orientation.direction)) {
79 orientation = directionUpToHeadingPitchRoll(
80 this,
81 destination,
82 orientation,
83 scratchSetViewOptions.orientation
84 );
85 }
86
87 //如果设置的持续时间小于0,则用setView方法直接改变view,也就是0秒、没动画
88 if (defined(options.duration) && options.duration <= 0.0) {
89 var setViewOptions = scratchSetViewOptions;
90 setViewOptions.destination = options.destination;
91 setViewOptions.orientation.heading = orientation.heading;
92 setViewOptions.orientation.pitch = orientation.pitch;
93 setViewOptions.orientation.roll = orientation.roll;
94 setViewOptions.convert = options.convert;
95 setViewOptions.endTransform = options.endTransform;
96 this.setView(setViewOptions);
97
98 //如果原来的options里还说了在视角转到目的地之后要做什么,则现在setview之后做
99 if (typeof options.complete === "function") {
100 options.complete();
101 }
102 return;
103 }
104
105 //如果是通过设置需要看到的矩形区域的四个坐标
106 var isRectangle = defined(destination.west);
107 if (isRectangle) {
108 //通过矩形的位置计算返回camera的位置
109 destination = this.getRectangleCameraCoordinates(
110 destination,
111 scratchFlyToDestination
112 );
113 }
114
115 var that = this;
116 var flightTween;
117
118 newOptions.destination = destination;
119 newOptions.heading = orientation.heading;
120 newOptions.pitch = orientation.pitch;
121 newOptions.roll = orientation.roll;
122 newOptions.duration = options.duration;
123 newOptions.complete = function () {
124 if (flightTween === that._currentFlight) {
125 that._currentFlight = undefined;
126 }
127 if (defined(options.complete)) {
128 options.complete();
129 }
130 };
131 newOptions.cancel = options.cancel;
132 newOptions.endTransform = options.endTransform;
133 newOptions.convert = isRectangle ? false : options.convert;
134 newOptions.maximumHeight = options.maximumHeight;
135 newOptions.pitchAdjustHeight = options.pitchAdjustHeight;
136 newOptions.flyOverLongitude = options.flyOverLongitude;
137 newOptions.flyOverLongitudeWeight = options.flyOverLongitudeWeight;
138 newOptions.easingFunction = options.easingFunction;
139
140 var scene = this._scene;
141 var tweenOptions = CameraFlightPath.createTween(scene, newOptions);
142 // If the camera doesn't actually need to go anywhere, duration
143 // will be 0 and we can just complete the current flight.
144 if (tweenOptions.duration === 0) {
145 if (typeof tweenOptions.complete === "function") {
146 tweenOptions.complete();
147 }
148 return;
149 }
150 flightTween = scene.tweens.add(tweenOptions);
151 this._currentFlight = flightTween;
152
153 // Save the final destination view information for the PRELOAD_FLIGHT pass.
154 var preloadFlightCamera = this._scene.preloadFlightCamera;
155 if (this._mode !== SceneMode.SCENE2D) {
156 if (!defined(preloadFlightCamera)) {
157 preloadFlightCamera = Camera.clone(this);
158 }
159 preloadFlightCamera.setView({
160 destination: destination,
161 orientation: orientation,
162 });
163
164 this._scene.preloadFlightCullingVolume = preloadFlightCamera.frustum.computeCullingVolume(
165 preloadFlightCamera.positionWC,
166 preloadFlightCamera.directionWC,
167 preloadFlightCamera.upWC
168 );
169 }
170 };
Cesium源码之flyTo(一)的更多相关文章
- Cesium源码剖析---Clipping Plane
		
之前就一直有写博客的想法,别人也建议写一写,但一直没有动手写,自己想了一下原因,就一个字:懒.懒.懒.为了改掉这个毛病,决定从今天开始写博客了,一方面对自己掌握的知识做一个梳理,另一方面和大家做一个交 ...
 - Cesium 源码笔记[1] Viewer模块实例化的大致过程
		
我原本想写日记的,但是不太现实. 源码下载 源码可以从源码包和发行包中的Source目录中获取. Cesium的模块化机制从1.63版本开始,由原来的RequireJs变为ES6.但有可能是原先设计耦 ...
 - Cesium源码剖析---Post Processing之物体描边(Silhouette)
		
Cesium在1.46版本中新增了对整个场景的后期处理(Post Processing)功能,包括模型描边.黑白图.明亮度调整.夜视效果.环境光遮蔽等.对于这么炫酷的功能,我们绝不犹豫,先去翻一翻它的 ...
 - Cesium源码剖析---视频投影
		
Cesium中的视频投影是指将视频作为一种物体材质,实现在物体上播放视频的效果.这个功能在Cesium早期版本中就支持了,在Code Example中有一个示例.今天就来分析一下其内部实现原理. 1. ...
 - Cesium源码剖析---Ambient Occlusion(环境光遮蔽)
		
Ambient Occlusion简称AO,中文没有太确定的叫法,一般译作环境光遮蔽.百度百科上对AO的解释是这样的:AO是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光 ...
 - cesium结合geoserver利用WFS服务实现图层新增(附源码下载)
		
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
 - cesium结合geoserver利用WFS服务实现图层编辑(附源码下载)
		
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
 - cesium结合geoserver利用WFS服务实现图层删除(附源码下载)
		
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
 - cesium编程中级(二)源码编译
		
cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...
 - cesium 结合 geoserver 实现地图属性查询(附源码下载)
		
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
 
随机推荐
- SpringCloud -Netflix 总结·
			
springcloud 核心组件 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.智能路由.消息 ...
 - 第2-4-6章 springboot整合规则引擎Drools-业务规则管理系统-组件化-中台
			
目录 7. Spring整合Drools 7.1 Spring简单整合Drools 7.1.1 以上代码均在drools_spring项目中 7.2 Spring整合Drools+web 7.2 以上 ...
 - 【算法总结】【队列均LinkedList】栈和队列、双端队列的使用及案例
			
1.栈 初始化:Stack<E> stack = new Stack<>(); 出栈:stack.pop() 或 stack.remove(stack.size() - 1) ...
 - USB口3A限流保护芯片。带短路保护
			
一般说明 PW1503是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路情况.它具有超温保护以及反向闭锁功能. PW1503采用薄型(1毫米)5针薄型SOT封装,提供可调版本. ...
 - 浏览器DevTools使用技巧
			
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:正则 作为一名前端开发人员,平时开发中使用最多的就是 Ch ...
 - Keras网络可视化方法
			
Keras网络可视化方法 Keras模型可视化 Keras可视化依赖的两个包 参考链接 Keras模型可视化 代码: from keras.utils import plot_model plot_m ...
 - Python全栈工程师之从网页搭建入门到Flask全栈项目实战(5) - Flask中的ORM使用
			
1.理解ORM ORM是MTV模型里面的Model模型 ORM(Object Relational Mapping),对象关系映射 举例:学生选课 学生和课程这两个实体,一个学生可以选择多门课程,一个 ...
 - Github Actions 学习笔记
			
Github Actions是什么? Github Actions 官方介绍:GitHub Actions是一个持续集成和持续交付(CI/CD)平台,允许您自动化构建.测试和部署管道.您可以创建构建和 ...
 - Django框架:8、聚合查询、分组查询、F与Q查询、ORM查询优化、ORM事务操作、ORM常用字段类型、ORM常用字段参数
			
Django 数据库 目录 Django 数据库 一.聚合查询 二.分组查询 三.F查询与Q查询 1.F查询 2.Q查询 3.Q查询进阶操作 四.ORM查询优化 1.only与defer 五.ORM事 ...
 - 14、java.sql.SQLException: 无效的列类型: 1111 报错问题解决
			
转载自 在项目中利用Mybatis做持久化框架,XXXMapper.xml中insert语句做插入时,偶然会遇到一些报错或者说是问题,如下: 一.报错日志: nested exception is o ...