| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 | 
							- /**
 -  * @Author: Caven
 -  * @Date: 2021-06-08 20:41:51
 -  */
 - 
 - import { Cesium } from '@dc-modules/namespace'
 - 
 - class KeyboardRoaming {
 -   constructor(viewer) {
 -     this._viewer = viewer
 -     this._enable = false
 -     this._moveRate = 100.0
 -     this._rotateRate = 0.01
 -     this._flags = {
 -       moveForward: false,
 -       moveBackward: false,
 -       moveUp: false,
 -       moveDown: false,
 -       moveLeft: false,
 -       moveRight: false,
 -       turnLeft: false,
 -       turnRight: false
 -     }
 -   }
 - 
 -   set enable(enable) {
 -     if (this._enable === enable) {
 -       return this
 -     }
 -     if (this._viewer.scene.mode !== Cesium.SceneMode.SCENE3D) {
 -       return this
 -     }
 -     this._enable = enable
 -     this._enable ? this._bindEvent() : this._unbindEvent()
 -     return this
 -   }
 - 
 -   get enable() {
 -     return this._enable
 -   }
 - 
 -   set moveRate(moveRate) {
 -     this._moveRate = moveRate
 -     return this
 -   }
 - 
 -   get moveRate() {
 -     return this._moveRate
 -   }
 - 
 -   set rotateRate(rotateRate) {
 -     this._rotateRate = rotateRate
 -     return this
 -   }
 - 
 -   get rotateRate() {
 -     return this._rotateRate
 -   }
 - 
 -   /**
 -    *
 -    * @private
 -    */
 -   _bindEvent() {
 -     let canvas = this._viewer.scene.canvas
 -     canvas.setAttribute('tabindex', '0')
 -     canvas.addEventListener('click', this._onClick.bind(this), false)
 -     this._viewer.clock.onTick.addEventListener(this._onTick, this)
 -     document.addEventListener('keydown', this._onKeydown.bind(this), false)
 -     document.addEventListener('keyup', this._onKeyup.bind(this), false)
 -   }
 - 
 -   /**
 -    *
 -    * @private
 -    */
 -   _unbindEvent() {
 -     Object.keys(this._flags).forEach(key => {
 -       this._flags[key] = false
 -     })
 -     let canvas = this._viewer.scene.canvas
 -     canvas.removeAttribute('tabindex')
 -     canvas.removeEventListener('click', this._onClick, false)
 -     this._viewer.clock.onTick.removeEventListener(this._onTick, this)
 -     document.removeEventListener('keydown', this._onKeydown, false)
 -     document.removeEventListener('keyup', this._onKeyup, false)
 -   }
 - 
 -   /**
 -    *
 -    * @param e
 -    * @returns {undefined}
 -    * @private
 -    */
 -   _getFlagForKeyCode(e) {
 -     let flag = undefined
 -     switch (e.keyCode) {
 -       case 'W'.charCodeAt(0):
 -       case 38:
 -         if (e.shiftKey) {
 -           flag = 'moveUp'
 -         } else {
 -           flag = 'moveForward'
 -         }
 -         break
 -       case 'S'.charCodeAt(0):
 -       case 40:
 -         if (e.shiftKey) {
 -           flag = 'moveDown'
 -         } else {
 -           flag = 'moveBackward'
 -         }
 -         break
 -       case 'A'.charCodeAt(0):
 -         flag = 'moveLeft'
 -         break
 -       case 'D'.charCodeAt(0):
 -         flag = 'moveRight'
 -         break
 -       case 'Q'.charCodeAt(0):
 -         flag = 'turnLeft'
 -         break
 -       case 'E'.charCodeAt(0):
 -         flag = 'turnRight'
 -         break
 -       default:
 -         break
 -     }
 -     return flag
 -   }
 - 
 -   /**
 -    *
 -    * @private
 -    */
 -   _onClick() {
 -     let canvas = this._viewer.scene.canvas
 -     canvas.focus()
 -   }
 - 
 -   /**
 -    *
 -    * @param e
 -    * @private
 -    */
 -   _onKeydown(e) {
 -     let flag = this._getFlagForKeyCode(e)
 -     if (flag) {
 -       this._flags[flag] = true
 -     }
 -   }
 - 
 -   /**
 -    *
 -    * @param e
 -    * @private
 -    */
 -   _onKeyup(e) {
 -     Object.keys(this._flags).forEach(key => {
 -       this._flags[key] = false
 -     })
 -   }
 - 
 -   /**
 -    *
 -    * @private
 -    */
 -   _onTick() {
 -     let camera = this._viewer.scene.camera
 -     let cameraHeight = this._viewer.scene.globe.ellipsoid.cartesianToCartographic(
 -       camera.position
 -     ).height
 -     let moveRate = cameraHeight / this._moveRate
 -     let axis = Cesium.Cartesian3.clone(camera.position, new Cesium.Cartesian3())
 -     this._flags.moveForward && camera.moveForward(moveRate)
 -     this._flags.moveBackward && camera.moveBackward(moveRate)
 -     this._flags.moveUp && camera.moveUp(moveRate)
 -     this._flags.moveDown && camera.moveDown(moveRate)
 -     this._flags.moveLeft && camera.moveLeft(moveRate)
 -     this._flags.moveRight && camera.moveRight(moveRate)
 -     this._flags.turnLeft && camera.rotate(axis, -this._rotateRate)
 -     this._flags.turnRight && camera.rotate(axis, this._rotateRate)
 -   }
 - }
 - 
 - export default KeyboardRoaming
 
 
  |