// 移动位置、旋转 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) {
|
this.handler.setInputAction((p) => {
|
this.handlerOnLeafDown(p)
|
}, Cesium.ScreenSpaceEventType.LEFT_DOWN)
|
this.handler.setInputAction((p) => {
|
this.handlerOnMouseMove(p)
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
this.handler.setInputAction((p) => {
|
this.handlerOnLeftUp(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
|
}
|
}
|
|
//= ========= 方法 ==========
|
handlerOnLeafDown(event) {
|
const pickedObjects = this.scene.drillPick(event.position, 2)
|
|
for (let i = 0; i < pickedObjects.length; i++) {
|
const 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
|
}
|
}
|
}
|
|
handlerOnMouseMove(event) {
|
const 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
|
})
|
}
|
}
|
|
handlerOnLeftUp(event) {
|
if (this.dragging || this.rotating) {
|
this.rotating = this.dragging = false
|
this.scene.screenSpaceCameraController.enableRotate = true
|
// 如果没有这句话 会导致billboards的某些没有刷新,无法再次点击
|
this.billboards._createVertexArray = true
|
}
|
}
|
|
pickTerrain(wndpos) {
|
const ray = this.map.camera.getPickRay(wndpos)
|
const 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 (const i in this) {
|
delete this[i]
|
}
|
}
|
}
|