文章目录

  • 1.实现效果
  • 2.实现方法
    • 2.1实现思路
    • 2.2具体代码

Cesium实战系列文章总目录: 传送门

1.实现效果

2.实现方法

通过监听键盘字符输入来的动态调整相机位置和姿态角。

键盘输入字符和对应的相机操作如下表:

键盘操作 含义 说明
W moveForward 相机前移
S moveBackward 相机后移
A moveLeft 相机左移
D moveRight 相机右移
Q moveUp 相机上移
E moveDown 相机下移
lookUp 抬头
lookDown 低头
lookLeft 左转
lookRight 右转
0 twistLeft 顺时针转
. twistRight 逆时针转
+ zoomIn 放大
- zoomOut 缩小

2.1实现思路

(1)设置事件表
设置根据键盘输入的字符修改相机参数的事件表。(具体见下文代码)

当键盘被按下时,执行相机操作,键盘弹起时结束操作,防止误操作等。
(2)监听键盘输入
通过document监听键盘按下keydown和弹出keyup事件。

(3)为每帧渲染添加监听
监听clockonTick事件,在每帧渲染时调用,API:传送门

(4)修改相机参数
通过Camera相关方法进行设置,API:传送门

2.2具体代码

(1)代码调用
将核心功能封装成了keyboardMapRoaming.js,引入js后调用,代码如下:

// 键盘控制漫游
keyboardMapRoamingInit(viewer);

(2)具体函数
具体实现功能函数如下:

/** @Description: 使用键盘控制地图漫游* @Version: 1.0* @Author: Julian* @Date: 2022-04-07 16:04:07* @LastEditors: Julian* @LastEditTime: 2022-04-07 18:40:40*//*** @description: 使用键盘控制地图漫游初始化* @param {*} _viewer* @return {*}*/
function keyboardMapRoamingInit(_viewer) {// 添加键盘监听事件document.addEventListener('keydown', keyDown, false);document.addEventListener('keyup', keyUp, false);// 为每一帧添加监听事件_viewer.clock.onTick.addEventListener(function() {keyboardMapRoamingRender(_viewer);});
}// 定义事件组
let flags = {// 相机位置moveForward: false,moveBackward: false,moveLeft: false,moveRight: false,moveUp: false,moveDown: false,// 相机姿态lookUp: false,lookDown: false,lookLeft: false,lookRight: false,twistLeft: false,twistRight: false,// 缩放zoomIn: false,zoomOut: false
}// 相机位置:W:向前;S:向后;D:向右;A:向左;Q:升高;E:降低;
// 相机姿态:↑:抬头;↓:低头;←:左转;→:右转;0:顺时针;.:逆时针
// 缩放:+:放大,-:缩小;/*** @description: 根据键盘输入字符返回事件信息* @param {*} key* @return {*}*/
function getFlagFromKeyboard(key) {switch (key) {// 按字符的Unicode编码// 相机位置case 87:return 'moveForward';case 83:return 'moveBackward';case 68:return 'moveRight';case 65:return 'moveLeft';case 81:return 'moveUp';case 69:return 'moveDown';// 相机姿态 case 38:return 'lookUp';case 40:return 'lookDown';case 37:return 'lookLeft';case 39:return 'lookRight';case 96:return 'twistLeft';case 110:return 'twistRight';// 缩放case 107:return 'zoomIn';case 109:return 'zoomOut';default:return undefined;}
}/*** @description: 键盘按下* @param {*} event* @return {*}*/
function keyDown(event) {let flagName = getFlagFromKeyboard(event.keyCode);if (typeof flagName !== 'undefined') {flags[flagName] = true;}
}/*** @description: 键盘弹起* @param {*} event* @return {*}*/
function keyUp(event) {let flagName = getFlagFromKeyboard(event.keyCode);if (typeof flagName !== 'undefined') {flags[flagName] = false;}
}/*** @description: 根据事件调整相机* @param {*} _viewer* @return {*}*/
function keyboardMapRoamingRender(_viewer) {let camera = _viewer.camera;let ellipsoid = _viewer.scene.globe.ellipsoid;let cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;// 根据相机高度设置移动距离,比默认距离移动效果更好let moveRate = cameraHeight / 20.0;if (flags.moveForward) {camera.moveForward(moveRate);}if (flags.moveBackward) {camera.moveBackward(moveRate);}if (flags.moveLeft) {camera.moveLeft(moveRate);}if (flags.moveRight) {camera.moveRight(moveRate);}if (flags.moveUp) {camera.moveUp(moveRate);}if (flags.moveDown) {camera.moveDown(moveRate);}if (flags.lookUp) {camera.lookUp();}if (flags.lookDown) {camera.lookDown();}if (flags.lookLeft) {camera.lookLeft();}if (flags.lookRight) {camera.lookRight();}if (flags.twistLeft) {camera.twistLeft();}if (flags.twistRight) {camera.twistRight();}// 根据相机高度设置缩放参数if (flags.zoomIn) {camera.zoomIn(cameraHeight / 2);}if (flags.zoomOut) {camera.zoomOut(cameraHeight / 2);}
}

cesium实现键盘控制地图场景漫游效果相关推荐

  1. cesium实现键盘控制模型姿态变化效果

    文章目录 1.实现效果 2.实现方法 2.1实现思路 2.2具体代码 Cesium实战系列文章总目录: 传送门 1.实现效果 2.实现方法 参考官方沙盒示例:传送门 2.1实现思路 (1)加载模型 使 ...

  2. threejs 实现场景漫游效果(相机沿着自定义轨道移动)

    一.先看看效果 效果视频: Video_22-06-15_18-10-11 二.实现方法: 实现思路:先创建一条曲线curve作为运动路线,然后使用const points = curve.getPo ...

  3. Cesium for Unreal 数据加载 场景漫游 粒子效果 视频监控 VR预览

    Cesium for Unreal: Cesium出了UE插件后一直没有时间学习体验,而且也从来没有接触过UE开发,只是在网上看过一些用UE做的数字孪生的案例,看上去确实是十分炫酷,正好最近工作不是很 ...

  4. Cesium 事件详解(鼠标事件、相机事件、键盘事件、场景触发事件)

    Cesium 事件详解(鼠标事件.相机事件.键盘事件.场景触发事件) 1 Cesium中的事件 根据使用情况,我把Cesium中的事件大体分为三种,即屏幕空间事件处理程序,屏幕空间相机控制器,场景触发 ...

  5. 8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画

     1 添加场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...

  6. 高德地图水纹预警效果;高德地图控制可视行政区域

    利用高德地图的"调节Shape属性"功能 <%@page language="java" contentType="text/html; cha ...

  7. js 判断支持webgl_基于WebGL无插件虚拟场景漫游技术如何构建?ThingJS

    #三维可视化##3D开发# WebGL, ThingJS及3DSMAX 虚拟场馆漫游技术构建 基础组件 加载三维模型 实现虚拟漫游 渲染优化 如果要构建一个具有交互性和拓展性的沉浸式漫游场景,常用到3 ...

  8. APE结合键盘控制角色运动 转

    在AS3物理引擎APE试用一文中,我简单记录了关于APE的基本调用,并实现了在重力作用环境下,一个自由落体的碰撞过程.现在我们把代码来改进一下,修改为一个横版的动作游戏场景(虽然目前它还算不上游戏,呵 ...

  9. js判断是否支持webgl_基于WebGL无插件虚拟场景漫游关键技术(完全版)ThingJS

    #三维可视化##3D开发# WebGL, ThingJS及3DSMAX 虚拟场馆漫游技术构建 基础组件 加载三维模型 实现虚拟漫游 渲染优化 如果要构建一个具有交互性和拓展性的沉浸式漫游场景,常用到3 ...

最新文章

  1. 检查 linux guest vm 使用的什么 虚拟化技术
  2. Git之不明觉厉11-利其器source tree
  3. 有关绑定没有数据显示的问题
  4. LINQPad学习与验证工具
  5. Python Django开发案例:显示登录页面
  6. Jsonp 跨域请求实例
  7. Productivity Power Tools,对于Visual Studio 2017的15个扩展
  8. Oracle学习笔记--导航
  9. setIconImage(icon);设置JFrame窗口标题图标
  10. 理解各种聚类算法的差异
  11. 《Swift 权威指南》——第6章,第6.1节函数的定义和调用
  12. Project Euler 66: Diophantine equation
  13. 从Exchange 2010 SP1高可用性环境下升级到SP2
  14. 什么是华为数通? 华为数通HCIE学些什么?
  15. 微信公众号h5 微信分享朋友 分享给朋友圈 分享给朋友
  16. 阿波罗无法通过链接外网
  17. 【iOS】This operation can fail if the version of the OS on the device is incompatible
  18. LOGO的国际标准规范
  19. 高考失利后选择出国留学,一年至少20万人民币到底值不值?
  20. 安卓接入微信php处理,PHP对接微信公众号实现简单自动回复

热门文章

  1. Z790和Z690主板区别 Z790和Z690主板哪个好
  2. 软件测试的指标成功率靠谱吗,【图】怎么样才能测试公式的成功率?_股票公式,股票,炒股,股票软件,炒股软件_指标编写互助答疑论坛_理想论坛 - 股票论坛...
  3. 游戏服务端开发-全局唯一ID
  4. setDate() 解决跨月问题
  5. 代码永无bug 佛主镇楼
  6. 【图像隐藏】基于LDPC编码译码改进DCT变换算法实现水印嵌入提取matlab源码
  7. 十大经典零食,你吃过几样?
  8. sysctl.conf文件的路径及作用
  9. 自动填写数据与自动点击锭钮提交数据
  10. 考研一战失败想对自己说的