cesium中实现鼠标拖动实体功能

实现在三维场景中对添加到场景中的s3m小品模型进行拖拽重新定位

let modelDragHandler;
function openEntityDrag() {
     let self = this;
     if (!modelDragHandler) {
         modelDragHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
         modelDragHandler.setInputAction(({
             position
         }) => { // 为viewer绑定MOUSE_DOWN事件监听器(执行函数,监听的事件)
             const pickInfo = viewer.scene.pick(position);
             if (!pickInfo) {
                 return;
             }; // 如果点击空白区域,则不往下执行
             viewer.scene.screenSpaceCameraController.enableRotate = false; // 将相机锁定,不然后续移动实体时相机也会动
             modelDragHandler.setInputAction((arg) => { // 为viewer绑定MOUSE_MOVE事件监听器(执行函数,监听的事件)
                 const position = arg.endPosition; // arg有startPosition与endPosition两个属性,即移动前后的位置信息:Cartesian2对象
                 const cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(position),viewer.scene); //将Cartesian2转为Cartesian3
                     const selectedEntity = viewer.selectedEntity; // 实体
                     if(!selectedEntity) {
                         return false;
                     }
                 let instance = selectedEntity.primitive;
                 // instance._position = cartesian;// 更新实体位置为当前鼠标位置
                 let oldPosition = selectedEntity.primitive.position;
                 instance.updatePosition(cartesian);
             }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

             modelDragHandler.setInputAction(({
                 position
             }) => { //为viewer绑定LEFT_UP事件监听器(执行函数,监听的事件)
                 modelDragHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); // 解除viewer的MOUSE_MOVE事件监听器
                 modelDragHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP); // 解除viewer的LEFT_UP事件监听器
                 viewer.scene.screenSpaceCameraController.enableRotate = true; // 取消相机锁定
             }, Cesium.ScreenSpaceEventType.LEFT_UP)

         }, Cesium.ScreenSpaceEventType.LEFT_DOWN)

     }
 }

实现效果

你可能感兴趣的:(Cesium,javascript,javascript,前端)