keyboard.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*
  2. * @Description: 使用键盘控制地图漫游
  3. * @Version: 1.0
  4. * @Author: Julian
  5. * @Date: 2022-04-07 16:04:07
  6. * @LastEditors: Julian
  7. * @LastEditTime: 2022-04-07 18:40:40
  8. */
  9. /**
  10. * @description: 使用键盘控制地图漫游初始化
  11. * @param {*} _viewer
  12. * @return {*}
  13. */
  14. function keyboardMapRoamingInit(_viewer) {
  15. // 添加键盘监听事件
  16. document.addEventListener('keydown', keyDown, false);
  17. document.addEventListener('keyup', keyUp, false);
  18. // 为每一帧添加监听事件
  19. _viewer.clock.onTick.addEventListener(function() {
  20. keyboardMapRoamingRender(_viewer);
  21. });
  22. }
  23. // 定义事件组
  24. let flags = {
  25. // 相机位置
  26. moveForward: false,
  27. moveBackward: false,
  28. moveLeft: false,
  29. moveRight: false,
  30. moveUp: false,
  31. moveDown: false,
  32. // 相机姿态
  33. lookUp: false,
  34. lookDown: false,
  35. lookLeft: false,
  36. lookRight: false,
  37. twistLeft: false,
  38. twistRight: false,
  39. // 缩放
  40. zoomIn: false,
  41. zoomOut: false
  42. }
  43. // 相机位置:W:向前;S:向后;D:向右;A:向左;Q:升高;E:降低;
  44. // 相机姿态:↑:抬头;↓:低头;←:左转;→:右转;0:顺时针;.:逆时针
  45. // 缩放:+:放大,-:缩小;
  46. /**
  47. * @description: 根据键盘输入字符返回事件信息
  48. * @param {*} key
  49. * @return {*}
  50. */
  51. function getFlagFromKeyboard(key) {
  52. switch (key) {
  53. // 按字符的Unicode编码
  54. // 相机位置
  55. case 87:
  56. return 'moveForward';
  57. case 83:
  58. return 'moveBackward';
  59. case 68:
  60. return 'moveRight';
  61. case 65:
  62. return 'moveLeft';
  63. case 81:
  64. return 'moveUp';
  65. case 69:
  66. return 'moveDown';
  67. // 相机姿态
  68. case 38:
  69. return 'lookUp';
  70. case 40:
  71. return 'lookDown';
  72. case 37:
  73. return 'lookLeft';
  74. case 39:
  75. return 'lookRight';
  76. case 96:
  77. return 'twistLeft';
  78. case 110:
  79. return 'twistRight';
  80. // 缩放
  81. case 107:
  82. return 'zoomIn';
  83. case 109:
  84. return 'zoomOut';
  85. default:
  86. return undefined;
  87. }
  88. }
  89. /**
  90. * @description: 键盘按下
  91. * @param {*} event
  92. * @return {*}
  93. */
  94. function keyDown(event) {
  95. let flagName = getFlagFromKeyboard(event.keyCode);
  96. if (typeof flagName !== 'undefined') {
  97. flags[flagName] = true;
  98. }
  99. }
  100. /**
  101. * @description: 键盘弹起
  102. * @param {*} event
  103. * @return {*}
  104. */
  105. function keyUp(event) {
  106. let flagName = getFlagFromKeyboard(event.keyCode);
  107. if (typeof flagName !== 'undefined') {
  108. flags[flagName] = false;
  109. }
  110. }
  111. /**
  112. * @description: 根据事件调整相机
  113. * @param {*} _viewer
  114. * @return {*}
  115. */
  116. function keyboardMapRoamingRender(_viewer) {
  117. let camera = _viewer.camera;
  118. let ellipsoid = _viewer.scene.globe.ellipsoid;
  119. let cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
  120. // 根据相机高度设置移动距离,比默认距离移动效果更好
  121. let moveRate = cameraHeight / 20.0;
  122. if (flags.moveForward) {
  123. camera.moveForward(moveRate);
  124. }
  125. if (flags.moveBackward) {
  126. camera.moveBackward(moveRate);
  127. }
  128. if (flags.moveLeft) {
  129. camera.moveLeft(moveRate);
  130. }
  131. if (flags.moveRight) {
  132. camera.moveRight(moveRate);
  133. }
  134. if (flags.moveUp) {
  135. camera.moveUp(moveRate);
  136. }
  137. if (flags.moveDown) {
  138. camera.moveDown(moveRate);
  139. }
  140. if (flags.lookUp) {
  141. camera.lookUp();
  142. }
  143. if (flags.lookDown) {
  144. camera.lookDown();
  145. }
  146. if (flags.lookLeft) {
  147. camera.lookLeft();
  148. }
  149. if (flags.lookRight) {
  150. camera.lookRight();
  151. }
  152. if (flags.twistLeft) {
  153. camera.twistLeft();
  154. }
  155. if (flags.twistRight) {
  156. camera.twistRight();
  157. }
  158. // 根据相机高度设置缩放参数
  159. if (flags.zoomIn) {
  160. camera.zoomIn(cameraHeight / 2);
  161. }
  162. if (flags.zoomOut) {
  163. camera.zoomOut(cameraHeight / 2);
  164. }
  165. }