三维飞行优化

首先来看下基础api提供的方法

 1 function TestCamera()
 2 {
 3     var sceneControl = new SuperMap.Web.UI.Controls.SceneControl(document.getElementById("sceneControlDiv"));
 4     var scene = sceneControl.get_scene();
 5
 6     使用经纬度和高度构造一个相机对象
 7     var camera = new SuperMap.Web.Realspace.Camera(116,40,350000);
 8
 9     设置相机高度模式
10     camera.set_altitudeMode(SuperMap.Web.Realspace.AltitudeMode.ClampToGround);
11
12      设置相机视角的方位角
13     camera.set_heading(120);
14
15      设置相机的俯角
16     camera.set_tilt(45);
17
18      弹出相机设置是否有效的提示
19     alert("The camera is set:" + camera.isValid());
20
21     将三维场景飞行到指定的相机处
22     scene.get_flyingOperator().flyTo(camera,1000,SuperMap.Web.Realspace.FlyingMode.JUMP);
23 }

示例

自我评价:

缺点:

  1. 飞行直接飞过去,如果camera高度比较低,直接贴着地面飞过去,用户体验相当不好;
  2. 飞行的时候,如果设置了一定的tilt角度,跳转过去的时候,定位不准确。

为了解决原始api的这种问题,经过经验总结,现写此种方法分享,如有疑问可以讨论:

基本思路:

在飞行的时候,分为3步骤:

  1. 首先从当前位置,视角改为垂直向下,朝向正北,抬高到一定高度(即:tilt:0,heading:0,altitude:n);
  2. 从抬高后的位置,飞行到对应位置,camera姿态不变;
  3. camera姿态由垂直向下改为以一定角度查看(目前设置为tilt=60);

具体代码示例如下:

 1 FlyOpt.prototype.flyToBase=function(p_flyAititude,p_ajustTime,p_longitude,p_latitude,p_altitude,p_flyTime,p_viewRange){
 2     var scene = sceneControl.get_scene();
 3     var _obj=this; // 记录对象
 4
 5     /// 转为正北方向、垂直向下视角,并提升高度
 6     var _c=scene.get_camera();
 7     _c.set_altitude(p_flyAititude);
 8     _c.set_heading(0);
 9     _c.set_tilt(0);
10     scene.get_flyingOperator().flyTo(_c,p_ajustTime,SuperMap.Web.Realspace.FlyingMode.JUMP);
11
12     /// 提升高度后,开始跳转到对应位置
13     setTimeout(function(){
14         var camera = new SuperMap.Web.Realspace.Camera(p_longitude,p_latitude,p_flyAititude);
15
16         //设置相机高度模式
17         camera.set_altitudeMode(SuperMap.Web.Realspace.AltitudeMode.CLAMP_TO_GROUND);
18
19          //设置相机视角的方位角
20         camera.set_heading(0);
21
22          //设置相机的俯角
23         camera.set_tilt(0);
24
25         //将三维场景飞行到指定的相机处
26         scene.get_flyingOperator().flyTo(camera,p_flyTime,SuperMap.Web.Realspace.FlyingMode.JUMP);
27
28         /// 飞行到位置后,调整俯仰角度
29         setTimeout(function(){
30             var _cc=_obj.getCameraByViewPt(p_longitude,p_latitude,p_altitude,p_viewRange);
31             //
32             var camera = new SuperMap.Web.Realspace.Camera(_cc["x"],_cc["y"],_cc["z"]);
33
34             //设置相机高度模式
35             camera.set_altitudeMode(SuperMap.Web.Realspace.AltitudeMode.CLAMP_TO_GROUND);
36
37              //设置相机视角的方位角
38             camera.set_heading(_cc["heading"]);
39
40              //设置相机的俯角
41             camera.set_tilt(_cc["tilt"]);
42
43             scene.get_flyingOperator().flyTo(camera,p_ajustTime,SuperMap.Web.Realspace.FlyingMode.JUMP);
44         },p_flyTime+100);
45     },p_ajustTime+100);
46 }

优化后的跳转示例

第1、2步很好实现,主要是第3步:如果设置为定位位置的x,y,z的话,camera视角tilt修改后,目标就不在视角范围内,或者不是正好看着目标。

这种方法怎么解决呢,经过测试,发现一种解决思路,仅供大家参考:

在第三步跳转的时候,故意将目标坐标,向北偏移一定距离,且高度提高一定高度,再调整视角的时候,目标就正好到视角中心。

 1 var _cameraInfo={};
 2     _cameraInfo["x"]=p_x;
 3     /// heading为0
 4     _cameraInfo["heading"]=0;
 5
 6     /// tilt角度
 7     _cameraInfo["tilt"]=60;
 8
 9     ///  默认以向北移动(高度)米, 纬度=距离/111000
10     _cameraInfo["y"]=p_y+p_z/111000.0;
11     _cameraInfo["z"]=p_z+p_range;

第三步示例

注:这里向北偏移 目标坐标z的值,高度增加 目标坐标 altitude+50

自我评价:

该种方法,飞行效果用户体验比较好。

完整代码请查看:http://git.oschina.net/wander_chang/SuperMap_iclient/blob/master/FlyOpt.js

时间: 2024-08-06 07:58:08

三维飞行优化的相关文章

智能算法|有哪些以动物命名的算法?

黄梅时节家家雨,青草池塘处处蛙. 有约不来过夜半,闲敲棋子落灯花. 鱼群算法?鸟群算法?蝙蝠算法?蚁群算法?病毒算法?...what?这些是什么沙雕算法? 别看这些算法名字挺接地气的,实际上确实很接地气... 以动物命名的算法可远不止这些,俗话说得好,只要脑洞大,就能玩出新花样,这句话在启发式算法界绝对名副其实!然鹅什么是启发式算法呢? 启发式算法:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被

PyCon 2014:机器学习应用占据Python的半壁江山

来自http://www.infoq.com/cn/news/2014/07/pycon-2014 今年的PyCon于4月9日在加拿大蒙特利尔召开,凭借快速的原型实现能力, Python在学术界得到了广泛应用.最近其官方网站发布了大会教程部分的视频和幻灯片,其中有很多(接近一半数量)跟数据挖掘和机器学习相关的内容,本文对此逐一介绍. 如何形式化一个科学问题然后用Python进行分析 目前有很多很强大Python数据挖掘库,比如Python语言的交互开发环境IPython,Python机器学习库S

GIS基础软件及操作(十一)

原文 GIS基础软件及操作(十一) 练习十一.3D 可视分析 1.对地理数据进行透视观察.三维浏览:2.制作飞行动画 GIS数据三维显示 (1) 运行程序:[开始菜单]>>[所有程序]>>[ArcGIS]>>[ArcScene],打开 ArcScene (2) 在ArcScene中执行命令: [自定义]>>[扩展模块], 选中 [3D Analyst]扩展模块, 在ArcScene中点击[添加数据]按钮(如下图红色前头所指),将图层(Roads , bldg

【算法学习笔记】77.双线棋盘 动态规划 SJTU OJ 1263 纸来纸去

dp[i][j][k][l] 表示同时从(1,1)到(i,j)和从(1,1)到(k,l) 的 最大热心程度. (= = 三维的优化 有时间在搞..) 注意这里有个地方和别人不太一样,我是判断如果终点重复的时候,直接减去一次那个点得好心度,表示有一条经过时该位置的人的好心度是0: #include <iostream> using namespace std; int map[55][55]={0},dp[55][55][55][55]={0}; int max(int a,int b){ret

Unity 用户手册用户指南二维纹理 (Texture 2D)

http://www.58player.com/blog-2327-953.html 二维纹理 (Texture 2D) 纹理 (Textures) 使您的 网格 (Meshes).粒子 (Particles) 和界面变得生动!它们是您覆盖或环绕对象的图像或电影文件.因为它们如此重要,所以具有许多属性.如果是首次阅读此内容,请向下跳转到详细信息,在需要参考时返回实际设置.   用于对象的着色器对所需纹理具有特定要求,但是基本原则是可以将任何图像文件置于工程中.如果它满足大小要求(下面指定),则会

hdu5543(Pick The Sticks) 01背包

Pick The Sticks Time Limit: 15000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 2540    Accepted Submission(s): 850 Problem Description The story happened long long ago. One day, Cao Cao made a special order

递推(二):递推法的应用

下面通过一些典型实例及其扩展来讨论递推法的应用. [例2]骨牌铺方格 在2×n的一个长方形方格中,用一种2×1的骨牌铺满方格.输入n(n<=40),输出铺放方案的总数. 例如n=3时,为2×3方格,骨牌的铺放方案有三种,如下图1所示. 图1  2×3方格的骨牌铺放方案 (1)编程思路. 设f[i]为铺满2*n方格的方案数,则有    f[i]=f[i-1]+f[i-2]. 其中,f[i-1]为铺满2*(n-1)方格的方案数(既然前面的2*(n-1)的方格已经铺满,那么最后一个只能是竖着放).f[

cesium三维漫游飞行效果实现

详细的实现过程见:这里 本篇实现cesium三维漫游飞行效果,效果图如下: 原文地址:https://www.cnblogs.com/giserhome/p/9038353.html

Arcgis api for javascript学习笔记-三维地图的飞行效果

其实就只是用到了 view.goTo()  函数,再利用 window.setInterval()  函数(定时器)定时执行goTo().代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scala