123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- "use script"; //开发环境建议开启严格模式
- // 移动位置、旋转 3dtiles
- class TilesEditor extends mars3d.BaseClass {
- //========== 构造方法 ==========
- constructor(options) {
- super(options);
- this.options = options;
- this.map = options.map;
- this.scene = this.map.scene;
- this._position = options.position;
- this._heading = options.heading || 0;
- this._range = options.range || 100;
- this.dragging = false;
- this.rotating = false;
- this._enabled = false;
- this.billboards = this.map.scene.primitives.add(new Cesium.BillboardCollection());
- this.handler = new Cesium.ScreenSpaceEventHandler(this.map.canvas);
- //用来平移位置的指示器
- this.movep = this.billboards.add({
- position: this.position,
- color: Cesium.Color.fromCssColorString("#FFFF00"),
- image: options.moveImg,
- show: false,
- disableDepthTestDistance: Number.POSITIVE_INFINITY,
- });
- //用来旋转的指示器
- this.rotatep = this.billboards.add({
- position: this.rotationPosition,
- color: Cesium.Color.fromCssColorString("#FFFF00"),
- image: options.rotateImg,
- show: false,
- disableDepthTestDistance: Number.POSITIVE_INFINITY,
- });
- }
- //========== 对外属性 ==========
- //启用状态
- get enabled() {
- return this._enabled;
- }
- set enabled(val) {
- this._enabled = val;
- if (val) {
- var self = this;
- this.handler.setInputAction((p) => {
- self.handler_onLeafDown(p);
- }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
- this.handler.setInputAction((p) => {
- self.handler_onMouseMove(p);
- }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
- this.handler.setInputAction((p) => {
- self.handler_onLeftUp(p);
- }, Cesium.ScreenSpaceEventType.LEFT_UP);
- this.rotatep.show = true;
- this.movep.show = true;
- } else {
- this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
- this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
- this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
- this.rotatep.show = false;
- this.movep.show = false;
- }
- }
- //移动位置的图标位置
- get position() {
- return this._position;
- }
- set position(value) {
- this._position = value;
- this.movep.position = this.position;
- this.rotatep.position = this.rotationPosition;
- }
- //旋转方向的图标位置(依据位置和朝向计算)
- get rotationPosition() {
- if (this._position) {
- return mars3d.PointUtil.getPositionByDirectionAndLen(this._position, this._heading, this._range);
- } else {
- return null;
- }
- }
- get heading() {
- return this._heading;
- }
- set heading(value) {
- this._heading = value;
- if (this._position) {
- this.rotatep.position = this.rotationPosition;
- }
- }
- get range() {
- return this._range;
- }
- set range(value) {
- this._range = value;
- if (this._position) {
- this.rotatep.position = this.rotationPosition;
- }
- }
- //========== 方法 ==========
- handler_onLeafDown(event) {
- var pickedObjects = this.scene.drillPick(event.position, 2);
- for (var i = 0; i < pickedObjects.length; i++) {
- var pickedObject = pickedObjects[i];
- if (Cesium.defined(pickedObject) && pickedObject.primitive === this.movep) {
- this.dragging = true;
- this.scene.screenSpaceCameraController.enableRotate = false;
- break;
- } else if (Cesium.defined(pickedObject) && pickedObject.primitive === this.rotatep) {
- this.rotating = true;
- this.scene.screenSpaceCameraController.enableRotate = false;
- break;
- }
- }
- }
- handler_onMouseMove(event) {
- var position = this.pickTerrain(event.endPosition);
- if (!position) {
- return;
- }
- if (this.dragging) {
- this.position = position;
- this.movep.position = this.position;
- this.rotatep.position = this.rotationPosition;
- this.fire(mars3d.EventType.change, {
- position: this._position,
- });
- } else if (this.rotating) {
- this.rotatep.position = position;
- this._range = Cesium.Cartesian3.distance(this._position, position);
- this._heading = mars3d.MeasureUtil.getAngle(this._position, position); //模型是正东为0
- this.fire(mars3d.EventType.change, {
- heading: this._heading,
- });
- }
- }
- handler_onLeftUp(event) {
- if (this.dragging || this.rotating) {
- this.rotating = this.dragging = false;
- this.scene.screenSpaceCameraController.enableRotate = true;
- //如果没有这句话 会导致billboards的某些没有刷新,无法再次点击
- this.billboards._createVertexArray = true;
- }
- }
- pickTerrain(wndpos) {
- var ray = this.map.camera.getPickRay(wndpos);
- var pos = this.map.scene.globe.pick(ray, this.map.scene);
- return pos;
- }
- remove() {
- //从场景中移除
- if (this.billboards) {
- this.scene.primitives.remove(this.billboards);
- this.billboards = undefined;
- }
- this.rotatep.show = false;
- this.movep.show = false;
- }
- destroy() {
- this.remove();
- this.handler.destroy();
- //删除所有绑定的数据
- for (let i in this) {
- delete this[i];
- }
- }
- }
|