软键盘控制cesium相机移动旋转

1.有航向 类似于控制飞机飞行

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Cesium.js"></script>
    <link rel="stylesheet"
        href="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Widgets/widgets.css" />
    <script src="https://cdn.bootcdn.net/ajax/libs/Turf.js/6.5.0/turf.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@dvgis/cesium-map/dist/cesium.map.min.js"></script>
    <title>Document</title>
    <style>
        body,
        html {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        .lonLat {
            position: fixed;
            width: 100%;
            bottom: 0;
            /* left: 50%; */
            color: aliceblue;
            text-align: center;
        }

        button:focus {
            outline: none;
            /* 取消选中时的轮廓边框 */
            box-shadow: none;
            /* 取消选中时的阴影效果 */

        }

        button {
            width: 80px;
            height: 50px;
            -webkit-user-select: none;
            /* Chrome, Safari, Opera */
            -moz-user-select: none;
            /* Firefox */
            -ms-user-select: none;
            /* Internet Explorer/Edge */
            user-select: none;
            /* 此规则适用于大多数浏览器 */
        }
    </style>
</head>

<body>
    <div id="cesiumContainer"></div>
    <div class="lonLat">
        <button class="btn1">前</button>
        <button class="btn2">后</button>
        <button class="btn3">左</button>
        <button class="btn4">右</button>
        <button class="btn5">上</button>
        <button class="btn6">下</button>
        <button class="rotation1">旋转heading+</button>
        <button class="rotation2">旋转heading-</button>
        <button class="rotation5">旋转pitch+</button>
        <button class="rotation6">旋转pitch-</button>
        <button class="rotation3">旋转roll+</button>
        <button class="rotation4">旋转roll-</button>
        <button class="openC">开启</button>
        <button class="closeC">关闭</button>
    </div>
    <script>
        // document.oncontextmenu = new Function("event.returnValue=false");
        // document.onselectstart = new Function("event.returnValue=false");
        // document.addEventListener("keydown", function (e) {
        //  		console.log(e.key);
        //         if (e.key == "F12") {
        //           e.preventDefault(); // 如果按下键F12,阻止事件
        //         }
        //     });



        var viewerWindow = new Cesium.Viewer("cesiumContainer", {


            geocoder: false, // 位置查找工具
            timeline: false, // 底部时间线
            homeButton: false, // 视角返回初始位置
            fullscreenButton: false, // 全屏
            animation: false, // 左下角仪表盘(动画器件)
            sceneModePicker: false, // 选择视角的模式(球体、平铺、斜视平铺)
            navigationHelpButton: false, //导航帮助按钮
            targetFrameRate: 30,
            imageryProvider: new Cesium.SingleTileImageryProvider({
                url: "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",
            }),
            baseLayerPicker: false,
        });

        // 不显示底图
        // viewerWindow.imageryLayers.get(0).show = false;
        // 去除logo
        viewerWindow.cesiumWidget.creditContainer.style.display = "none";

        // 高德
        var optionsG = {
            style: 'img', // style: img、elec、cva//地标 网路
            crs: 'WGS84', // 使用84坐标系,默认为:GCJ02
            maximumLevel: 18, // 设置最大级别
            // minimumLevel: 5   // 设置最小级别
        }
        viewerWindow.imageryLayers.add(new Cesium.ImageryLayer(new AmapImageryProvider(optionsG)))
        // // 腾讯
        // var optionsT = {
        //     style: 'img' //style: img、1:经典
        // }
        // viewerWindow.imageryLayers.add(new Cesium.ImageryLayer(new TencentImageryProvider(optionsT)))
        // 百度
        // var optionsBI = {
        //     style: 'img', // style: img、vec//地标 网路、normal、dark
        //     crs: 'WGS84' // 使用84坐标系,默认为:BD09
        // }
        // viewerWindow.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsBI)))
        var optionsB = {
            style: 'vec', // style: img、vec//地标 网路、normal、dark
            crs: 'WGS84', // 使用84坐标系,默认为:BD09
            maximumLevel: 18, // 设置最大级别
            // minimumLevel: 5   // 设置最小级别
        }
        viewerWindow.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsB)))

        viewerWindow.screenSpaceEventHandler.setInputAction(movement => {
            // 方式 1
            var cartesian = viewerWindow.camera.pickEllipsoid(movement.position, viewerWindow.scene.globe.ellipsoid);
            if (cartesian) {
                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(8);
                var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(8);
                let height = this.viewerWindow.camera.positionCartographic.height.toFixed(2);
                // var point = GPS.bd09_To_Gcj02(latitudeString,longitudeString)
                // this.nowPosition = point.lon + ',' +  point.lat + "," + height
                // console.log(this.nowPosition,'this.nowPosition');
                this.nowPosition = longitudeString + ',' + latitudeString + "," + height
                this.nowPositionheight = height
                console.log("LongitudeAndLatitude: " + longitudeString + "," + latitudeString + "," + height);
                var h = this.viewerWindow.scene.camera.heading;
                var p = this.viewerWindow.scene.camera.pitch;
                var r = this.viewerWindow.scene.camera.roll;
                console.log("headingPitchRoll: " + h + "," + p + "," + r);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);


        let pointDestination = Cesium.Cartesian3.fromDegrees(116.40069537, 39.96790221, 1500);//视野点

        viewerWindow.scene.camera.flyTo({
            destination: pointDestination,
            orientation: {
                heading: 6.283185307179586,
                pitch: -1.5707963267948966,
                roll: 0
            }
        })





        class ControlCamera {
            constructor(viewer) {
                this.timeInterval = 50
                this.viewer = viewer;
                this.deviceType = this.getDeviceType();
                this.ellipsoid = this.viewer.scene.globe.ellipsoid;
                this.initControl()
            }
            initControl() {
                this.downStart = 'touchstart';
                this.upEnd = 'touchend';
                if (this.deviceType == "电脑") {
                    this.downStart = "mousedown"
                    this.upEnd = "mouseup"
                }
            }
            enterKeyBoardMouseRoamingMode() {
                console.log('进入漫游模式');// 1.初始化相机漫游的标记
                this.flags = {
                    moveForward: false, // 是否向前移动
                    moveBackward: false, // 是否向后移动
                    moveLeft: false, // 是否向左移动
                    moveRight: false, // 是否向右移动
                    moveUp: false, // 是否向上移动
                    moveDown: false, // 是否向下移动
                }; // 相机漫游标记
                // 2.添加键盘监听事件
                // 键盘按下事件

                document.addEventListener('keydown', this.keyDown, false);
                // 键盘弹起事件
                document.addEventListener('keyup', this.keyUp, false);
                // // 3.添加渲染事件
                this.viewer.clock.onTick.addEventListener(this.renderEvent);
            }
            exitKeyBoardMouseRoamingMode() {
                console.log('退出漫游');
                // 1.移除键盘监听事件
                document.removeEventListener('keydown', this.keyDown, false);
                document.removeEventListener('keyup', this.keyUp, false);

                // 移除渲染事件
                this.viewer.clock.onTick.removeEventListener(this.renderEvent);

                this.flags = null;
            }
            keyDown = (event) => {
                let flagName = this.getFlagFromKeyCode(event.keyCode);
                if (typeof flagName !== 'undefined') {
                    this.flags[flagName] = true;
                }
            }/*** 键盘弹起*/
            keyUp = (event) => {
                let flagName = this.getFlagFromKeyCode(event.keyCode);
                if (typeof flagName !== 'undefined') {
                    this.flags[flagName] = false;
                }
            }/*** 渲染函数*/
            renderEvent = () => {
                // 声明变量,以下代码可能会多次用到
                let camera = this.viewer.camera;
                // 根据高度来决定镜头移动的速度
                let cameraHeight = this.ellipsoid.cartesianToCartographic(camera.position).height;
                let moveRate = cameraHeight / 50.0;
                if (this.flags.moveForward) { camera.moveForward(moveRate); }
                if (this.flags.moveBackward) { camera.moveBackward(moveRate); }
                if (this.flags.moveUp) { camera.moveUp(moveRate); }
                if (this.flags.moveDown) { camera.moveDown(moveRate); }
                if (this.flags.moveLeft) { camera.moveLeft(moveRate); }
                if (this.flags.moveRight) { camera.moveRight(moveRate); }
            }
            rotateCamera(n) {
                // 获取当前相机
                const camera = this.viewer.camera;

                // 获取当前相机的方向(heading)
                const currentHeading = camera.heading;

                // 设置旋转后的方向(顺时针旋转10度)
                const newHeading = currentHeading + Cesium.Math.toRadians(n);

                // 将相机旋转到新的方向
                camera.setView({
                    orientation: {
                        heading: newHeading,
                        pitch: camera.pitch,
                        roll: camera.roll,
                    },
                });
            }
            getFlagFromKeyCode(keyCode) {
                console.log("keyCode", keyCode);
                switch (keyCode) {
                    case 'W'.charCodeAt(0): return 'moveForward';
                    case 'S'.charCodeAt(0): return 'moveBackward';
                    case 'Q'.charCodeAt(0): return 'moveUp';
                    case 'E'.charCodeAt(0): return 'moveDown';
                    case 'D'.charCodeAt(0): return 'moveRight';
                    case 'A'.charCodeAt(0): return 'moveLeft';
                    default: return undefined;
                }
            }
            getDeviceType() {
                const userAgent = navigator.userAgent;
                console.log(userAgent);
                if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
                    return "平板";
                } else if (
                    /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
                        userAgent
                    )
                ) {
                    return "手机";
                } else {
                    return "电脑";
                }
            }
            addButtonTransformEvent(id, eventName) {
                let timer = null
                let button = document.querySelector(id);
                if (button) {
                    button.addEventListener(this.downStart, () => {
                        if (!this.flags) {
                            return
                        }
                        this.flags[eventName] = true
                        timer = setInterval(() => {
                            console.log('按钮被按下!');
                        }, this.timeInterval);
                    })
                    button.addEventListener(this.upEnd, () => {
                        if (!this.flags) {
                            return
                        }
                        clearInterval(timer)
                        this.flags[eventName] = false
                        console.log('按钮被松开!');
                    });
                }

            }

            addButtonRotationEvent(id, type = true, speed = 10) {
                let timerrotation = null
                let rotation = document.querySelector(id);
                if (rotation) {
                    rotation.addEventListener(this.downStart, () => {
                        if (!this.flags) {
                            return
                        }
                        timerrotation = setInterval(() => {
                            if (type) {
                                this.rotateCamera(speed)
                            } else {
                                this.rotateCamera(-speed)
                            }
                            console.log('按钮被按下!');
                        }, this.timeInterval);
                    })
                    rotation.addEventListener(this.upEnd, () => {
                        if (!this.flags) {
                            return
                        }
                        clearInterval(timerrotation)
                        console.log('按钮被松开!');
                    });

                }

            }
        }

        let controlCameraIncetance = new ControlCamera(viewerWindow)


        document.querySelector('.openC').addEventListener("click", () => {
            console.log(1);
            controlCameraIncetance.enterKeyBoardMouseRoamingMode()
            controlCameraIncetance.addButtonTransformEvent('.btn1', 'moveForward')
            controlCameraIncetance.addButtonTransformEvent('.btn2', 'moveBackward')
            controlCameraIncetance.addButtonTransformEvent('.btn3', 'moveLeft')
            controlCameraIncetance.addButtonTransformEvent('.btn4', 'moveRight')
            controlCameraIncetance.addButtonTransformEvent('.btn5', 'moveUp')
            controlCameraIncetance.addButtonTransformEvent('.btn6', 'moveDown')
            controlCameraIncetance.addButtonRotationEvent('.rotation1', true, 2)
            controlCameraIncetance.addButtonRotationEvent('.rotation2', false, 2)
        })
        document.querySelector('.closeC').addEventListener("click", () => {
            console.log(2);
            controlCameraIncetance.exitKeyBoardMouseRoamingMode()
        })








    </script>
</body>

</html>
  1. 同高度飞行,通过航向角计算封装
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Cesium.js"></script>
    <link rel="stylesheet"
        href="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Widgets/widgets.css" />
    <script src="https://cdn.bootcdn.net/ajax/libs/Turf.js/6.5.0/turf.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@dvgis/cesium-map/dist/cesium.map.min.js"></script>
    <title>Document</title>
    <style>
        body,
        html {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        .lonLat {
            position: fixed;
            width: 100%;
            bottom: 0;
            /* left: 50%; */
            color: aliceblue;
            text-align: center;
        }

        button:focus {
            outline: none;
            /* 取消选中时的轮廓边框 */
            box-shadow: none;
            /* 取消选中时的阴影效果 */

        }

        button {
            width: 80px;
            height: 50px;
            -webkit-user-select: none;
            /* Chrome, Safari, Opera */
            -moz-user-select: none;
            /* Firefox */
            -ms-user-select: none;
            /* Internet Explorer/Edge */
            user-select: none;
            /* 此规则适用于大多数浏览器 */
        }
    </style>
</head>

<body>
    <div id="cesiumContainer"></div>
    <div class="lonLat">
        <div>
            <button class="openC">开启</button>
            <button class="closeC">关闭</button>

        </div>
        <button class="btn1">前</button>
        <button class="btn2">后</button>
        <button class="btn3">左</button>
        <button class="btn4">右</button>
        <!-- <button class="btn5">上</button>
        <button class="btn6">下</button> -->
        <button class="rotation1">旋转heading+</button>
        <button class="rotation2">旋转heading-</button>
        <!-- <button class="rotation5">旋转pitch+</button>
        <button class="rotation6">旋转pitch-</button>
        <button class="rotation3">旋转roll+</button>
        <button class="rotation4">旋转roll-</button> -->
    </div>
    <script>
        // document.oncontextmenu = new Function("event.returnValue=false");
        // document.onselectstart = new Function("event.returnValue=false");
        // document.addEventListener("keydown", function (e) {
        //  		console.log(e.key);
        //         if (e.key == "F12") {
        //           e.preventDefault(); // 如果按下键F12,阻止事件
        //         }
        //     });

        // function getDeviceType() {
        //     const userAgent = navigator.userAgent;
        //     console.log(userAgent);
        //     if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
        //         return "平板";
        //     } else if (
        //         /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
        //             userAgent
        //         )
        //     ) {
        //         return "手机";
        //     } else {
        //         return "电脑";
        //     }
        // }

        // // 使用示例
        // const deviceType = getDeviceType();



        // console.log("设备类型:", deviceType);

        var viewer = new Cesium.Viewer("cesiumContainer", {


            geocoder: false, // 位置查找工具
            timeline: false, // 底部时间线
            homeButton: false, // 视角返回初始位置
            fullscreenButton: false, // 全屏
            animation: false, // 左下角仪表盘(动画器件)
            sceneModePicker: false, // 选择视角的模式(球体、平铺、斜视平铺)
            navigationHelpButton: false, //导航帮助按钮
            targetFrameRate: 30,
            imageryProvider: new Cesium.SingleTileImageryProvider({
                url: "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",
            }),
            baseLayerPicker: false,
        });

        // 不显示底图
        // viewer.imageryLayers.get(0).show = false;
        // 去除logo
        viewer.cesiumWidget.creditContainer.style.display = "none";

        // 高德
        var optionsG = {
            style: 'img', // style: img、elec、cva//地标 网路
            crs: 'WGS84', // 使用84坐标系,默认为:GCJ02
            maximumLevel: 18, // 设置最大级别
            // minimumLevel: 5   // 设置最小级别
        }
        viewer.imageryLayers.add(new Cesium.ImageryLayer(new AmapImageryProvider(optionsG)))
        // // 腾讯
        // var optionsT = {
        //     style: 'img' //style: img、1:经典
        // }
        // viewer.imageryLayers.add(new Cesium.ImageryLayer(new TencentImageryProvider(optionsT)))
        // 百度
        // var optionsBI = {
        //     style: 'img', // style: img、vec//地标 网路、normal、dark
        //     crs: 'WGS84' // 使用84坐标系,默认为:BD09
        // }
        // viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsBI)))
        var optionsB = {
            style: 'vec', // style: img、vec//地标 网路、normal、dark
            crs: 'WGS84', // 使用84坐标系,默认为:BD09
            maximumLevel: 18, // 设置最大级别
            // minimumLevel: 5   // 设置最小级别
        }
        viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsB)))

        viewer.screenSpaceEventHandler.setInputAction(movement => {
            // 方式 1
            var cartesian = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
            if (cartesian) {
                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(8);
                var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(8);
                let height = this.viewer.camera.positionCartographic.height.toFixed(2);
                // var point = GPS.bd09_To_Gcj02(latitudeString,longitudeString)
                // this.nowPosition = point.lon + ',' +  point.lat + "," + height
                // console.log(this.nowPosition,'this.nowPosition');
                this.nowPosition = longitudeString + ',' + latitudeString + "," + height
                this.nowPositionheight = height
                console.log("LongitudeAndLatitude: " + longitudeString + "," + latitudeString + "," + height);
                var h = this.viewer.scene.camera.heading;
                var p = this.viewer.scene.camera.pitch;
                var r = this.viewer.scene.camera.roll;
                console.log("headingPitchRoll: " + h + "," + p + "," + r);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);


        let pointDestination = Cesium.Cartesian3.fromDegrees(116.40069537, 39.96790221, 1500);//视野点

        viewer.scene.camera.flyTo({
            destination: pointDestination,
            orientation: {
                heading: 6.283185307179586,
                pitch: -1.5707963267948966,
                roll: 0
            }
        })


        class CameraNavigation {
            constructor(viewer) {
                this.viewer = viewer;
                this.moveEndHandler = null;
                this.speed = null
                this.moveSpeed = null;
                this.height = null;
                this.buttonEvent = {};
                this.rotationSpeed = 2
                this.deviceType = this.getDeviceType();
                this.initControl()
               
                this.btnSAddEventListenerName = []
            }
            getDeviceType() {
                const userAgent = navigator.userAgent;
                console.log(userAgent);
                if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
                    return "平板";
                } else if (
                    /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
                        userAgent
                    )
                ) {
                    return "手机";
                } else {
                    return "电脑";
                }
            }
           initControl() {
                this.downStart = 'touchstart';
                this.upEnd = 'touchend';
                if (this.deviceType == "电脑") {
                    this.downStart = "mousedown"
                    this.upEnd = "mouseup"
                }
                console.log( this.upEnd, this.downStart);
            }

            setupEventListeners() {
                let currentHeightInit = this.viewer.camera.positionCartographic.height;
                this.height = Math.round(currentHeightInit);
                // 添加高度变化监听事件
                this.moveEndHandler = () => {
                    console.log(111);
                    const currentHeight = this.viewer.camera.positionCartographic.height;
                    this.height = Math.round(currentHeight);
                    if (!this.moveSpeed) {
                        this.speed = this.height/100
                    }else {
                        this.speed = this.moveSpeed
                    }
                }
                this.viewer.camera.moveEnd.addEventListener(this.moveEndHandler);
                console.log(this.height,'this.height');

            }
            setupCameraNavigation() {
                // 定义事件处理函数
                this.handleKeyDown =(event)=> {
                    console.log(event.key);
                    switch (event.key) {
                        // case 'ArrowUp' || 'w':
                        case 'w':
                            this.moveCamera("Up");
                            break;
                        // case 'ArrowDown' || 'd':
                        case 's':
                            this.moveCamera("Down");
                            break;
                        // case 'ArrowLeft' || 's':
                        case 'a':
                            this.moveCamera("Left");
                            break;
                        // case 'ArrowRight' || 'a':
                        case 'd':
                            this.moveCamera("Right");
                            break;
                        case 'q':
                            this.rotationCamera(10);
                            break;
                        case 'e':
                            this.rotationCamera(-10);
                            break;
                        default:
                            break;
                    }
                }

                // 添加键盘按下事件监听器
                document.addEventListener('keydown', this.handleKeyDown);
            }

            removeCameraNavigation() {
                this.btnSAddEventListenerName.forEach(ele=>{
                    document.querySelector(ele.id).removeEventListener(this.downStart,this.buttonEvent[ele.eventName].up, false)
                    document.querySelector(ele.id).removeEventListener(this.upEnd,this.buttonEvent[ele.eventName].upEnd, false)
                })
                // 移除键盘按下事件监听器
                if (this.handleKeyDown) {
                    document.removeEventListener('keydown', this.handleKeyDown);
                }
                // 取消高度变化监听事件
                this.viewer.camera.moveEnd.removeEventListener(this.moveEndHandler);
                this.btnSAddEventListenerName =[]
                this.buttonEvent = {}
            }

            moveCamera(type = 'Up') {
                // 获取当前Cesium相机
                const camera = this.viewer.camera;

                // 获取当前相机的位置和方向
                const currentPosition = camera.positionCartographic.clone();
                const currentHeading = camera.heading;

                // 定义移动的距离和方向
                const distance = this.speed; // 1000米示例距离
                let bearing = Cesium.Math.toDegrees(currentHeading); // 使用当前方向

                switch (type) {
                    case 'Up': // 向上移动
                        bearing = Cesium.Math.toDegrees(currentHeading)
                        break;
                    case 'Down': // 向下移动
                        bearing = Cesium.Math.toDegrees(currentHeading - Math.PI); // 使用当前方向
                        break;
                    case 'Left': // 向左移动
                        bearing = Cesium.Math.toDegrees(currentHeading - Math.PI / 2); // 使用当前方向
                        break;
                    case 'Right': // 向右移动
                        bearing = Cesium.Math.toDegrees(currentHeading + Math.PI / 2); // 使用当前方向
                        break;
                    default:
                        break;
                }
                // 使用Turf.js计算新位置
                const destination = turf.destination(
                    turf.point([Cesium.Math.toDegrees(currentPosition.longitude), Cesium.Math.toDegrees(currentPosition.latitude)]),
                    distance,
                    bearing,
                    { units: 'meters' }
                );
                // 将新位置转换为Cesium坐标
                const newCartesian = Cesium.Cartesian3.fromDegrees(destination.geometry.coordinates[0], destination.geometry.coordinates[1], this.height);

                // 设置相机位置
                camera.position = newCartesian;
            }
            rotationCamera(n) {

                // 获取当前相机
                const camera = this.viewer.camera;

                // 获取当前相机的方向(heading)
                const currentHeading = camera.heading;

                // 设置旋转后的方向(顺时针旋转10度)
                const newHeading = currentHeading + Cesium.Math.toRadians(n);

                // 将相机旋转到新的方向
                camera.setView({
                    orientation: {
                        heading: newHeading,
                        pitch: camera.pitch,
                        roll: camera.roll,
                    },
                });
            }
            addButtonTransformEvent(id, eventName) {
                let timer = null
                let button = document.querySelector(id);
                let eventNameString  =eventName;
                let findObj = this.btnSAddEventListenerName.find(ele=>ele.id== id)
                if (findObj) {
                    return
                }{
                    this.btnSAddEventListenerName.push({
                        id:id,
                        eventName:eventName
                    })
                }
                if (button) {
                    this.buttonEvent[eventName] = {}
                    this.buttonEvent[eventName].up =   () => {
                        if (timer) {
                            clearInterval(timer)
                        }
                        
                        timer = setInterval(() => {
                            console.log('按钮被按下!');
                            if (eventNameString == "moveForward") {
                                this.moveCamera("Up");
                            }else if (eventNameString == "moveBackward") {
                                this.moveCamera("Down");
                            }
                            else if (eventNameString == "moveLeft") {
                                this.moveCamera("Left");
                            }
                            else if (eventNameString == "moveRight") {
                                this.moveCamera("Right");
                            }
                            else if (eventNameString == "rotation+") {
                                this.rotationCamera(this.rotationSpeed) ;
                            }
                            else if (eventNameString == "rotation-") {
                                this.rotationCamera(-this.rotationSpeed) ;
                            }
                        }, 30);
                        console.log(eventNameString, 'eventName');
                    }
                    button.addEventListener(this.downStart,this.buttonEvent[eventName].up, false)
                    this.buttonEvent[eventName].upEnd = () => {
                        clearInterval(timer)
                        console.log('按钮被松开!');
                    }
                    button.addEventListener(this.upEnd,this.buttonEvent[eventName].upEnd, false);
                }

            }
        }

        // 使用示例
        const cameraNavigation = new CameraNavigation(viewer);
        document.querySelector('.openC').addEventListener("click", () => {
            cameraNavigation.setupCameraNavigation()
            // cameraNavigation.moveSpeed = 100 // 移动速度 默认是当前相机高度/100的速度
            cameraNavigation.rotationSpeed = 0.2// 旋转速度 默认是2度每次
            cameraNavigation.setupEventListeners();
            cameraNavigation.addButtonTransformEvent('.btn1', 'moveForward')
            cameraNavigation.addButtonTransformEvent('.btn2', 'moveBackward')
            cameraNavigation.addButtonTransformEvent('.btn3', 'moveLeft')
            cameraNavigation.addButtonTransformEvent('.btn4', 'moveRight')
            cameraNavigation.addButtonTransformEvent('.rotation1', 'rotation+')
            cameraNavigation.addButtonTransformEvent('.rotation2', 'rotation-')
        });

        document.querySelector('.closeC').addEventListener("click", () => {
            cameraNavigation.removeCameraNavigation();
        });
    </script>
</body>

</html>
相关推荐
合方圆~小文1 小时前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
youngong2 天前
强迫症之用相机快门数批量重命名文件
数码相机·文件管理
weixin_466485115 天前
halcon标定助手的使用
数码相机
诸葛务农7 天前
ToF(飞行时间)相机在人形机器人非接触式传感领域内的应用
数码相机·机器人
塞北山巅7 天前
相机自动曝光(AE)核心算法——从参数调节到亮度标定
数码相机·算法
美摄科技8 天前
相机sdk是什么意思?
数码相机
phyit8 天前
全景相机领域,影石何以杀出重围?
数码相机
鄃鳕8 天前
装饰器【Python】
开发语言·python·数码相机
聪明不喝牛奶8 天前
【已解决】海康威视相机如何升级固件
数码相机
PAQQ8 天前
1站--视觉搬运工业机器人工作站 -- 相机部分
数码相机·机器人