Cesium用zoomTo函数实现对目标(各种实体)的视角控制

选用zoomTo函数是为了不锁定视角,且可以异步加载

参考:Cesium中的lookAt/lookAtTransform/setView/zoomTo_cesium lookat-CSDN博客

这个代码是一个过渡动画,如果只想固定视角,把循环去掉使用固定的参数就可以

// 起始方位角(当前视角水平方向角度,这里示例设为0度,转换为弧度)
        var startingHeading = Cesium.Math.toRadians(0);
        // 起始俯仰角(当前视角垂直方向角度,转换为弧度)
        var startingPitch = Cesium.Math.toRadians(-60);
        // 目标方位角(想要缓慢移动到的水平方向角度,转换为弧度)
        var targetHeading = Cesium.Math.toRadians(230);
        // 目标俯仰角(想要缓慢移动到的垂直方向角度,转换为弧度)
        var targetPitch = Cesium.Math.toRadians(-15);
        //过渡时的高度
        var startingRange = 5000;
        //最终高度
        var targetRange = 1000;

        // 过渡时长,单位毫秒,这里设为5000毫秒(即5秒)
        var duration = 10000; 
        // 获取当前时间戳,用于记录开始过渡的时间
        var startTime = Date.now();
        
        //初始过渡动画
        function updateCamera() {
            var currentTime = Date.now();
            var elapsedTime = currentTime - startTime;
            if (elapsedTime < duration) {
                // 计算方位角改变的速率(每一毫秒改变的弧度值)
                var headingRate = (targetHeading - startingHeading) / duration;
                // 计算俯仰角改变的速率(每一毫秒改变的弧度值)
                var pitchRate = (targetPitch - startingPitch) / duration;
                // 计算高度改变的速率
                var rangeRate = (targetRange - startingRange) / duration;
                // 更新当前方位角
                var currentHeading = startingHeading + headingRate * elapsedTime;
                // 更新当前俯仰角
                var currentPitch = startingPitch + pitchRate * elapsedTime;
                // 更新当前高度
                var currentRange = startingRange + rangeRate * elapsedTime;
                
                var orientation = new Cesium.HeadingPitchRange(currentHeading, currentPitch, currentRange);
                viewer.zoomTo(tileset, orientation);
                // 使用requestAnimationFrame继续下一帧更新,实现平滑过渡效果
                Cesium.requestAnimationFrame(updateCamera);
            } else {
                // 过渡完成后,直接设置为目标角度,确保精准达到目标位置
                var finalOrientation = new Cesium.HeadingPitchRange(targetHeading, targetPitch, targetRange);
                viewer.zoomTo(tileset, finalOrientation);
            }
        }

        // 启动视角缓慢移动的函数
        updateCamera();

封装函数版本

javascript 复制代码
 //初始过渡动画
        function updateCamera(startTime, startingHeading, targetHeading, startingPitch, targetPitch, startingRange, targetRange, duration) {
            let currentTime = Date.now();
            let elapsedTime = currentTime - startTime;
            if (elapsedTime < duration) {
                // 计算方位角改变的速率(每一毫秒改变的弧度值)
                let headingRate = (targetHeading - startingHeading) / duration;
                // 计算俯仰角改变的速率(每一毫秒改变的弧度值)
                let pitchRate = (targetPitch - startingPitch) / duration;
                // 计算高度改变的速率
                let rangeRate = (targetRange - startingRange) / duration;
                // 更新当前方位角
                let currentHeading = startingHeading + headingRate * elapsedTime;
                // 更新当前俯仰角
                let currentPitch = startingPitch + pitchRate * elapsedTime;
                // 更新当前高度
                let currentRange = startingRange + rangeRate * elapsedTime;

                let orientation = new Cesium.HeadingPitchRange(currentHeading, currentPitch, currentRange);
                viewer.zoomTo(tileset, orientation);
                // 使用requestAnimationFrame继续下一帧更新,实现平滑过渡效果
                Cesium.requestAnimationFrame(function (time) {
                    updateCamera(startTime, startingHeading, targetHeading, startingPitch, targetPitch, startingRange, targetRange, duration);
                });
            } else {
                // 过渡完成后,直接设置为目标角度,确保精准达到目标位置
                let finalOrientation = new Cesium.HeadingPitchRange(targetHeading, targetPitch, targetRange);
                viewer.zoomTo(tileset, finalOrientation);
            }
        }
相关推荐
只想静静的5 分钟前
vue 自定义指令( 全局自定义指令 | 局部自定义指令 )
前端·javascript·vue.js
jessezappy8 分钟前
日志:中文 URI 参数乱码之 encodeURI、encodeURIComponent、escape 作为 Ajax 中文参数编码给 ASP 的记录
javascript·中文乱码·uri·asp·escape
guokanglun11 分钟前
Vue模块化开发的理解
前端·javascript·vue.js
一丝晨光1 小时前
Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?
前端·c++·chrome·webkit·chromium·blink·trident
咔咔库奇1 小时前
CSS基础知识05(弹性盒子、布局详解,动画,3D转换,calc)
前端·css
孑么1 小时前
Vue前端框架开发 npm安装Vite或CLI
前端·javascript·vue.js·typescript·前端框架·npm·node.js
孑么1 小时前
GDPU Vue前端框架开发 单文件组件
前端·javascript·vue.js·前端框架·npm·node.js·ecmascript
Akiiiira1 小时前
【网页设计】HTML5 和 CSS3 提高
前端·css3·html5
Dragon Wu2 小时前
前端框架 详解遍历数组为何需要加Key
前端