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);
            }
        }
相关推荐
GISer_Jing2 分钟前
[总结篇]个人网站
前端·javascript
ss.li3 分钟前
TripGenie:畅游济南旅行规划助手:个人工作纪实(二十二)
javascript·人工智能·python
疯狂的沙粒23 分钟前
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
前端·uni-app·html
小妖66627 分钟前
html 滚动条滚动过快会留下边框线
前端·html
heroboyluck41 分钟前
Svelte 核心语法详解:Vue/React 开发者如何快速上手?
前端·svelte
海的诗篇_43 分钟前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
琹箐1 小时前
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
前端·javascript·anti-design-vue
程序员-小李1 小时前
VuePress完美整合Toast消息提示
前端·javascript·vue.js
Uyker2 小时前
从零开始制作小程序简单概述
前端·微信小程序·小程序
Dontla5 小时前
为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)
javascript·react.js·ecmascript