TilesEditor.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. "use script"; //开发环境建议开启严格模式
  2. // 移动位置、旋转 3dtiles
  3. class TilesEditor extends mars3d.BaseClass {
  4. //========== 构造方法 ==========
  5. constructor(options) {
  6. super(options);
  7. this.options = options;
  8. this.map = options.map;
  9. this.scene = this.map.scene;
  10. this._position = options.position;
  11. this._heading = options.heading || 0;
  12. this._range = options.range || 100;
  13. this.dragging = false;
  14. this.rotating = false;
  15. this._enabled = false;
  16. this.billboards = this.map.scene.primitives.add(new Cesium.BillboardCollection());
  17. this.handler = new Cesium.ScreenSpaceEventHandler(this.map.canvas);
  18. //用来平移位置的指示器
  19. this.movep = this.billboards.add({
  20. position: this.position,
  21. color: Cesium.Color.fromCssColorString("#FFFF00"),
  22. image: options.moveImg,
  23. show: false,
  24. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  25. });
  26. //用来旋转的指示器
  27. this.rotatep = this.billboards.add({
  28. position: this.rotationPosition,
  29. color: Cesium.Color.fromCssColorString("#FFFF00"),
  30. image: options.rotateImg,
  31. show: false,
  32. disableDepthTestDistance: Number.POSITIVE_INFINITY,
  33. });
  34. }
  35. //========== 对外属性 ==========
  36. //启用状态
  37. get enabled() {
  38. return this._enabled;
  39. }
  40. set enabled(val) {
  41. this._enabled = val;
  42. if (val) {
  43. var self = this;
  44. this.handler.setInputAction((p) => {
  45. self.handler_onLeafDown(p);
  46. }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
  47. this.handler.setInputAction((p) => {
  48. self.handler_onMouseMove(p);
  49. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  50. this.handler.setInputAction((p) => {
  51. self.handler_onLeftUp(p);
  52. }, Cesium.ScreenSpaceEventType.LEFT_UP);
  53. this.rotatep.show = true;
  54. this.movep.show = true;
  55. } else {
  56. this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
  57. this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  58. this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
  59. this.rotatep.show = false;
  60. this.movep.show = false;
  61. }
  62. }
  63. //移动位置的图标位置
  64. get position() {
  65. return this._position;
  66. }
  67. set position(value) {
  68. this._position = value;
  69. this.movep.position = this.position;
  70. this.rotatep.position = this.rotationPosition;
  71. }
  72. //旋转方向的图标位置(依据位置和朝向计算)
  73. get rotationPosition() {
  74. if (this._position) {
  75. return mars3d.PointUtil.getPositionByDirectionAndLen(this._position, this._heading, this._range);
  76. } else {
  77. return null;
  78. }
  79. }
  80. get heading() {
  81. return this._heading;
  82. }
  83. set heading(value) {
  84. this._heading = value;
  85. if (this._position) {
  86. this.rotatep.position = this.rotationPosition;
  87. }
  88. }
  89. get range() {
  90. return this._range;
  91. }
  92. set range(value) {
  93. this._range = value;
  94. if (this._position) {
  95. this.rotatep.position = this.rotationPosition;
  96. }
  97. }
  98. //========== 方法 ==========
  99. handler_onLeafDown(event) {
  100. var pickedObjects = this.scene.drillPick(event.position, 2);
  101. for (var i = 0; i < pickedObjects.length; i++) {
  102. var pickedObject = pickedObjects[i];
  103. if (Cesium.defined(pickedObject) && pickedObject.primitive === this.movep) {
  104. this.dragging = true;
  105. this.scene.screenSpaceCameraController.enableRotate = false;
  106. break;
  107. } else if (Cesium.defined(pickedObject) && pickedObject.primitive === this.rotatep) {
  108. this.rotating = true;
  109. this.scene.screenSpaceCameraController.enableRotate = false;
  110. break;
  111. }
  112. }
  113. }
  114. handler_onMouseMove(event) {
  115. var position = this.pickTerrain(event.endPosition);
  116. if (!position) {
  117. return;
  118. }
  119. if (this.dragging) {
  120. this.position = position;
  121. this.movep.position = this.position;
  122. this.rotatep.position = this.rotationPosition;
  123. this.fire(mars3d.EventType.change, {
  124. position: this._position,
  125. });
  126. } else if (this.rotating) {
  127. this.rotatep.position = position;
  128. this._range = Cesium.Cartesian3.distance(this._position, position);
  129. this._heading = mars3d.MeasureUtil.getAngle(this._position, position); //模型是正东为0
  130. this.fire(mars3d.EventType.change, {
  131. heading: this._heading,
  132. });
  133. }
  134. }
  135. handler_onLeftUp(event) {
  136. if (this.dragging || this.rotating) {
  137. this.rotating = this.dragging = false;
  138. this.scene.screenSpaceCameraController.enableRotate = true;
  139. //如果没有这句话 会导致billboards的某些没有刷新,无法再次点击
  140. this.billboards._createVertexArray = true;
  141. }
  142. }
  143. pickTerrain(wndpos) {
  144. var ray = this.map.camera.getPickRay(wndpos);
  145. var pos = this.map.scene.globe.pick(ray, this.map.scene);
  146. return pos;
  147. }
  148. remove() {
  149. //从场景中移除
  150. if (this.billboards) {
  151. this.scene.primitives.remove(this.billboards);
  152. this.billboards = undefined;
  153. }
  154. this.rotatep.show = false;
  155. this.movep.show = false;
  156. }
  157. destroy() {
  158. this.remove();
  159. this.handler.destroy();
  160. //删除所有绑定的数据
  161. for (let i in this) {
  162. delete this[i];
  163. }
  164. }
  165. }