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);
            }
        }
相关推荐
青皮桔7 分钟前
CSS实现百分比水柱图
前端·css
失落的多巴胺7 分钟前
使用deepseek制作“喝什么奶茶”随机抽签小网页
javascript·css·css3·html5
DataGear10 分钟前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
影子信息12 分钟前
vue 前端动态导入文件 import.meta.glob
前端·javascript·vue.js
青阳流月13 分钟前
1.vue权衡的艺术
前端·vue.js·开源
样子201817 分钟前
Vue3 之dialog弹框简单制作
前端·javascript·vue.js·前端框架·ecmascript
kevin_水滴石穿18 分钟前
Vue 中报错 TypeError: crypto$2.getRandomValues is not a function
前端·javascript·vue.js
翻滚吧键盘19 分钟前
vue文本插值
javascript·vue.js·ecmascript
孤水寒月1 小时前
给自己网站增加一个免费的AI助手,纯HTML
前端·人工智能·html
CoderLiu1 小时前
用这个MCP,只给大模型一个figma链接就能直接导出图片,还能自动压缩上传?
前端·llm·mcp