Cesium用wsad进行场景漫游(九)

打印 上一主题 下一主题

主题 981|帖子 981|积分 2943

2023-01-14
先看效果,wsadqe控制方向升降,鼠标拖动屏幕也可以控制方向

 
 整理下思路:
1. 使用movement变量控制是否进行漫游
2.1 进行漫游则先将enableRotate等全部取消
2.2 绑定Cesium.ScreenSpaceEventType.LEFT_DOWN等事件,用于计算鼠标移动并改变镜头方向,同时根据鼠标是否按下判断鼠标移动是否可以改变镜头方向
2.3 document.addEventListener监听按下的键盘按钮,进行相应的camera.moveForward等方法
3. 不进行漫游则恢复enableRotate等
 
代码如下:在vue中将其包装为一个Ismovement方法
  1.     //是否<el-button @click="Ismovement" >漫游模式</el-button>
  2.     Ismovement(){
  3.       var that = this;
  4.       this.movement = !this.movement;
  5.       //如果进行漫游
  6.       if(this.movement){
  7.         var ellipsoid = this.viewer.scene.globe.ellipsoid;
  8.         //先将鼠标控制事件全部取消
  9.         this.viewer.scene.screenSpaceCameraController.enableRotate = false;
  10.         this.viewer.scene.screenSpaceCameraController.enableTranslate = false;
  11.         this.viewer.scene.screenSpaceCameraController.enableZoom = false;
  12.         this.viewer.scene.screenSpaceCameraController.enableTilt = false;
  13.         this.viewer.scene.screenSpaceCameraController.enableLook = false;
  14.         var startMousePosition;
  15.         var mousePosition;
  16.         //控制方向
  17.         var flags = {
  18.           looking : false,
  19.           moveForward : false,
  20.           moveBackward : false,
  21.           moveUp : false,
  22.           moveDown : false,
  23.           moveLeft : false,
  24.           moveRight : false
  25.         };
  26.         //按下左键的同时克隆一个鼠标点击的位置
  27.         this.viewer.screenSpaceEventHandler.setInputAction(function(movement) {
  28.           flags.looking = true;
  29.           mousePosition = startMousePosition = Cesium.Cartesian3.clone(movement.position);
  30.         }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
  31.         //记录鼠标移动的终点
  32.         this.viewer.screenSpaceEventHandler.setInputAction(function(movement) {
  33.           mousePosition = movement.endPosition;
  34.         }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  35.         //looking改为false,意思是此时鼠标移动不会改变镜头方向
  36.         this.viewer.screenSpaceEventHandler.setInputAction(function(position) {
  37.           flags.looking = false;
  38.         }, Cesium.ScreenSpaceEventType.LEFT_UP);
  39.         //获得按下的哪个按钮
  40.         function getFlagForKeyCode(keyCode) {
  41.           switch (keyCode) {
  42.           case 'W'.charCodeAt(0):
  43.             return 'moveForward';
  44.           case 'S'.charCodeAt(0):
  45.             return 'moveBackward';
  46.           case 'Q'.charCodeAt(0):
  47.             return 'moveUp';
  48.           case 'E'.charCodeAt(0):
  49.             return 'moveDown';
  50.           case 'D'.charCodeAt(0):
  51.             return 'moveRight';
  52.           case 'A'.charCodeAt(0):
  53.             return 'moveLeft';
  54.           default:
  55.             return undefined;
  56.           }
  57.         }
  58.         //keydown如果长时间按下某个键,则重复触发按键按下事件。
  59.         document.addEventListener('keydown', this.down = function(e){
  60.           var flagName = getFlagForKeyCode(e.keyCode);
  61.           if (typeof flagName !== 'undefined') {
  62.             flags[flagName] = true;
  63.           }
  64.         }, false);
  65.         document.addEventListener('keyup', this.up =(e)=>{
  66.           var flagName = getFlagForKeyCode(e.keyCode);
  67.           if (typeof flagName !== 'undefined') {
  68.             flags[flagName] = false;
  69.           }
  70.         }, false);
  71.         //实时获取cesium clock的tick每一帧的时间,十分常用的功能
  72.         this.viewer.clock.onTick.addEventListener(function(clock) {
  73.          
  74.           var camera = that.viewer.camera;
  75.           // 镜头旋转
  76.           if (flags.looking) {
  77.             //获取画布的高度宽度
  78.             var width = that.viewer.canvas.clientWidth;
  79.             var height = that.viewer.canvas.clientHeight;
  80.             //相当于转动灵敏度,越大转动越快
  81.             var lookFactor =0.06;
  82.             //x和y是鼠标按下后移动的xy距离与画布长宽的比例
  83.             var x = (mousePosition.x - startMousePosition.x) / width;
  84.             var y = -(mousePosition.y - startMousePosition.y) / height;
  85.             
  86.             camera.setView({
  87.               //根据摄像头现在的朝向和刚才移动的比例进行方向更新
  88.               orientation: {
  89.                   heading : camera.heading + x*lookFactor,
  90.                   pitch : camera.pitch + y*lookFactor,   
  91.                   roll : 0.0                             
  92.               }
  93.             })
  94.           }
  95.           // 根据高度来决定镜头移动的速度
  96.           var cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
  97.           var moveRate = cameraHeight / 100.0;
  98.           if (flags.moveForward) {
  99.             camera.moveForward(moveRate);
  100.           }
  101.           if (flags.moveBackward) {
  102.             camera.moveBackward(moveRate);
  103.           }
  104.           if (flags.moveUp) {
  105.             camera.moveUp(moveRate);
  106.           }
  107.           if (flags.moveDown) {
  108.             camera.moveDown(moveRate);
  109.           }
  110.           if (flags.moveLeft) {
  111.             camera.moveLeft(moveRate);
  112.           }
  113.           if (flags.moveRight) {
  114.             camera.moveRight(moveRate);
  115.           }
  116.         });
  117.       }else{
  118.         //取消漫游
  119.         this.viewer.scene.screenSpaceCameraController.enableRotate = true;
  120.         this.viewer.scene.screenSpaceCameraController.enableTranslate = true;
  121.         this.viewer.scene.screenSpaceCameraController.enableZoom = true;
  122.         this.viewer.scene.screenSpaceCameraController.enableTilt = true;
  123.         this.viewer.scene.screenSpaceCameraController.enableLook = true;
  124.         this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
  125.         this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
  126.         this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
  127.         document.removeEventListener('keydown',this.down,false)
  128.         document.removeEventListener('keyup',this.up,false)
  129.    
  130.       }
  131.     },
复制代码
 
 
为了方便测试,这里用一个button进行控制是否漫游
  1. <el-button @click="Ismovement" >漫游模式</el-button>
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表