圆的移动就是把圆心赋值为鼠标当前位置,但是我们知道,实体的outline宽度不生效后我们改用的polyline来代替边框,那么我们要做的就不仅是改变圆心,还有边框的位置同样需要改变
折线以及多边形都是通过改变polyline的数组改变位置
Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())计算两个笛卡尔的分量差
Cesium.Cartesian3.add (left, right, result)计算两个笛卡尔的分量和
先使用Cesium.Cartesian3.subtract计算出鼠标移动的笛卡尔分量,再用原本的圆的位置加上这个分量得到新的位置更新到圆的polyline上以及圆心上。同理折线和多边形也是如此
polylineMove(start, result) {
// 计算平移向量
const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
// console.log(translationMatrix)
// 注意需要赋值三维坐标
this.overlays[this.overlays.length - 1].polyline.positions = this.overlays[this.overlays.length - 1].polyline.positions._value.map(item => {
return Cesium.Cartesian3.add(item, translationMatrix, new Cesium.Cartesian3())
})
},
handler.setInputAction((arg) => {
const start = this.viewer.camera.pickEllipsoid(arg.startPosition, this.viewer.scene.globe.ellipsoid)
const result = this.viewer.camera.pickEllipsoid(arg.endPosition, this.viewer.scene.globe.ellipsoid)
// 笛卡尔坐标转化为地理坐标Cesium.Cartographic.fromCartesian (cartesian, ellipsoid , result )-生成的对象将以弧度表示
// 更新实体位置为当前鼠标位置
if (this.overlays[this.overlays.length - 1].name.search('折线') !== -1) {
// 如果是折线,判断鼠标前后移动向量,所有坐标移动相同位移
this.polylineMove(start, result)
}
if (this.overlays[this.overlays.length - 1].name.search('多边形') !== -1) {
const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
this.polygonArr = this.polygonArr.map(item => {
return Cesium.Cartesian3.add(item, translationMatrix, new Cesium.Cartesian3())
})
this.overlays[this.overlays.length - 1].polygon.hierarchy = new Cesium.PolygonHierarchy(this.polygonArr)
this.polylineMove(start, result)
}
if (this.overlays[this.overlays.length - 1].name.search('圆') !== -1) {
// 计算平移向量
const translationMatrix = Cesium.Cartesian3.subtract(result, start, new Cesium.Cartesian3())
// 注意需要赋值三维坐标
this.polylineMove(start, result)
// 如果直接把当前移动位置给圆的圆心,会导致圆与圆的边框移动不一致
this.overlays[this.overlays.length - 1].position = Cesium.Cartesian3.add(this.overlays[this.overlays.length - 1].position._value, translationMatrix, new Cesium.Cartesian3())
}
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)