一场大的台风,路径通常很长,可能从靠近赤道的太平洋一直往北吹到东三省。跨度这么大,在三维GIS中,往往不容易看全。如果能够实现相机随动效果,即相机跟随台风步进、移动,就生动许多了。

感觉在cesium中,坐标和视角、相机、view是一个难点,我到现在都搞不清楚。方向(orientation)可以总结一下:

XYZ轴,由负到正,分别对应西东、南北、下上。(cesium是右手)

heading:视场角,观察者(相机?)与地球围绕Y轴转,可以想象为相机向左,地球就向右;反之。

pitch:俯仰角,观察者与地球围绕X轴转;观察者低头,看见地球南极,抬头,看见地球北极。

roll:旋转,观察者与地球围绕Z轴转;可以想象为地球就是一个平面的饼,在围绕圆心在转。

言归正传。一场台风在绘制过程中,每个步骤都有对应的一个坐标值。只要观察者能够跟随这个脚步,从空中俯视,就能观察到每一个步骤的细节。

问题是,如何才能跟随?

相机(camera)的话,有lookAt啦,setView啦,flyTo啦。前面2个在本场景中都用不上,相机不动,光调转角度不行。只有flyTo才会跟随。

但是,flyTo方法,既有viewer.flyTo,又有camera.flyTo。viewer.flyTo,飞向指定坐标点(也就是台风的某个步骤坐标点),该坐标点就会正正好出现在屏幕中央,最符合要求;而camera.flyTo,是相机飞到指定点,如果按照默认值,相机角度是正俯视地球,那么没有问题,指定点也会在屏幕中央;但问题是,相机往往设置了各种倾斜的角度,那么待观察的点就不会在屏幕中央,而是出现在一边,甚至根本看不见!

那我们还犹豫什么,就用viewer.flyTo就好了。不行啊,这个viewer.flyTo,如果当前有数据输出,画面在更新,它不会执行,只有等待一切平静后它才客客气气地执行。这就出现一场台风全部步骤绘制完毕以后,才执行这个viewer.flyTo,黄花菜都凉了。

所以,解决办法还是应该用camera.flyTo。飞到一个合适的坐标点,可以让被观察点(即台风步骤坐标点)出现在屏幕中央。现在的问题是,如何得到这个合适的坐标点,让相机飞过去?

可不可以根据相机的角度,和被观察点的坐标,倒推出这个坐标点,以至于相机来到这里,角度啥的不变,刚好让被观察点出现在屏幕中央?

这个不是方程式,我没有找到计算方法。但是也许可以间接计算。我是这么想的:

台风刚开始的时候,我们先viewer.flyTo台风起点,这时台风起点出现在屏幕中央;
台风前进一步,来到了一个新位置,这时,可以计算它与上一步的位移;
然后我用相机当前位置,加上这个位移,得到一个新的坐标点,这就是那个合适的坐标点
相机飞到这个该死的合适坐标点
以此类推。

代码如下:

//台风开始时,我们飞向起点p
let flyEntity = new Cesium.Entity({id : 'flyTmp',position : Cesium.Cartesian3.fromDegrees(p.x,p.y,0),point : {pixelSize : 1,color : Cesium.Color.WHITE.withAlpha(0.0),}
});
viewer.entities.add(flyEntity);return viewer.flyTo(flyEntity, {offset : {//角度啥都不变heading : viewer.camera.heading,pitch : viewer.camera.pitch,range : HEIGHT}
});
//一个台风步骤
function step(){let p1 = ... //上一步骤let p2 = ... //当前步骤let cp = viewer.camera.positionCartographic;//当前相机世界坐标let offset = Cesium.Cartesian3.subtract(//两个台风步骤之间的位移Cesium.Cartesian3.fromDegrees(p1.x, p2.y,cp.height), //这个高度必不可少Cesium.Cartesian3.fromDegrees(p1.x, p2.y,cp.height),                                new Cesium.Cartesian3());let newCameraLoc = Cesium.Cartesian3.add(//新的相机坐标点viewer.camera.position,offset,                          new Cesium.Cartesian3());viewer.camera.flyTo({destination : newCameraLoc,duration:2,//飞行时间2秒orientation : {heading : viewer.camera.heading,pitch : viewer.camera.pitch,roll : 0.0},complete:function(){//完成后进入下一步;职责链模式step();}});
}

当然啦,实际应用过程中,不会步步跟随,而是20步跟随一次,否则系统估计会卡死。

cesium中定位方法使用

cesium 相机跟随相关推荐

  1. Cesium 视角跟随-第一人称视角漫游

    Cesium 视角跟随-第一人称视角漫游 实现思路 核心代码 完整代码 在线示例 2023年4月19日更新-搞了一个 Cesium 镜像,欢迎使用:沙盒示例 和 API 作为三维项目,以第一人称视角漫 ...

  2. unity2D相机跟随

    目的:使得相机跟随角色移动 打开包管理器: 安装Cinemachine 界面上端会出现Cinemachine 选项: 点击Cinemachine 选项: 点击Create 2D Camera 同时左侧 ...

  3. 【Unity3D】相机跟随

    1 前言 相机跟随是相机指始终跟随特定游戏对象,有以下 2 种跟随效果: 位置跟随:相机指向目标游戏对象的向量始终不变 位置和姿态跟随:相机在目标游戏对象的坐标系下的坐标和朝向始终不变 实现相机位置和 ...

  4. 学习Unity3D之探照灯效果和相机跟随。

    欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌 ...

  5. 3D人物移动和相机跟随_学习整理资料

    核心1.新建工程,取名Exercise_3D. 2.新建个文件夹(3D_Assets),将所有素材资源,导入或拖入. 3.新建一个3DObject--Plane,取名(Ground)作为地面. 4.新 ...

  6. Unity相机跟随以及子弹发射笔记

    相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动. 步骤1. 创建和设置CameraMount 在层级(Hierar ...

  7. RPG游戏人物视角控制,相机跟随

    因为被人物视角控制困扰了好久,终于搞明白了,所以想记下来再梳理一遍,也希望大神看到能给我这个新人一些建议. 首先列出我参考了的博客: 游戏之角色移动和相机跟随 雨松大神解读的官方相机跟随脚本(我只看了 ...

  8. Unity-3D相机跟随控制

    Unity-3D相机跟随控制 跟随算法 横向与纵向旋转摄像机 滚轮调节距离 全部代码 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度下 ...

  9. Unity通过刚体组件和C#脚本,施加力实现物体下落并滚离平面 及相机跟随物体

    1. 新建场景,新建小球和平面,之间要有一段距离用于下落 2. 通过脚本实现对象的下落 (1)添加刚体组件rigidbody 质量默认为1,可以修改 (2)创建并编写脚本实现小球下落 using Sy ...

最新文章

  1. 读《惰者集》有感:数学是一门需要敏锐感觉的学问
  2. 小型可编程电源:WUZHI WZ5005
  3. ThinkPHP分页实例
  4. 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
  5. 简单的机器学习笔试题
  6. C#+SQL Server图片存取
  7. linux安装docker部署java项目
  8. Android开发(六)——组件颜色Selector(Selector与Shape的基本用法 )
  9. STM32----通用定时器TIM2~TIM5的三种功能
  10. leetcode 整数反转
  11. 20162319莫礼钟 2016-2017-2 《程序设计与数据结构》第2周学习总结
  12. 计算机打印指定测试页到文件夹中,上海计算机等级一级考试复习指导.pptx
  13. Kotlin语言内置函数学习2:with,also,takeIf,takeUnless
  14. Vue暴露的属性和方法
  15. android 浏览器 遥控器 光标,论Android智能电视盒子必装应用之——飞视浏览器
  16. 搭建腾讯云通用文字识别General OCR项目及代码部署图文教程
  17. 计算机毕设(附源码)JAVA-SSM绩效考核管理系统
  18. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
  19. c语言记账,C语言会计记账管理系统.doc
  20. 杭州住房公积金提取说明

热门文章

  1. 自然语言推断(NLI)、文本相似度相关开源项目推荐(Pytorch 实现)
  2. Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
  3. PSINS不可交换(圆锥/划桨)误差补偿
  4. FILTER的使用与过滤器实现session登录案例
  5. windows 用户的完美“瘦身”攻略
  6. 牛客入门编程—金字塔图案
  7. 小米频繁投资内容渠道 是回归理性还是曲线救赎
  8. Dubbo 第一章:详情版
  9. 2022起重机械指挥判断题及答案
  10. 社区宽带繁忙是什么意思_智慧社区盈利模式分析