地球自转且昼夜分明(cesium官网效果)

参考:

[1] Cesium 实现地球自转效果_cesium 自转_寻水的鱼lj的博客-优快云博客

[2] Cesium实现地球自转明暗分割,类似官网封面效果_cesium 地球自转-优快云博客

[3] cesium入门(一)_cesium.matrix4.identity_ygpGoogle的博客-优快云博客

官网效果:

本人效果:

核心(具体思路见参考):

1. 地球自转设置,见[1]。

        核心:Cesium.Transforms.computeIcrfToFixedMatrix计算矩阵,

                   lookAtTransform锁定相机视角到地固坐标系

                   知识点:Cesium里由两个基本坐标系,惯性坐标系和地固坐标系

2. 影像图层黑白透明度分开设置,见[2]。 

        注意:viewer.clockViewModel.shouldAnimate = true;

                   layer.dayAlpha = 0.0 //白天图层透明值

                   layer.nightAlpha = 1.0 //夜晚图层透明值

坑:

对于新手来说,可能不熟悉lookAtTransform,那么在结束自传效果时可能会出现相机姿态异常的问题,比如鼠标不能控制相机旋转之类的,只需要使用Cesium.Matrix4.IDENTITY初始化lookAtTransform内的矩阵即可。

代码:

本人菜鸡,可能有些乱,this.earth是我的viewer,本来我想传参数的,但是好像传参数之后没有效果,只能直接使用外部的this.earth才能监听到rotateSetting函数,各位谁要是知道问什么,请告诉我。

updateLighting(viewer) {
    viewer.scene.globe.enableLighting = true//必须开启光照效果,
    this.nightlayer = viewer.imageryLayers.addImageryProvider(
            new Cesium.ArcGisMapServerImageryProvider({
       url:"http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetPurplishBlue/MapServer"
     }));
   this.nightlayer.dayAlpha = 0.0 //白天图层透明值
   this.nightlayer.nightAlpha = 1.0 //夜晚图层透明值
   // this.nightlayer.brightness = 3.5 //图层发光亮度

   viewer.scene.globe.enableLighting = true;//打开光照
   viewer.clock.shouldAnimate = true;//时间轴动画
   viewer.clock.multiplier = 1000;//时间轴速度
}
rotateSetting = () => {
        if (!this.earth || this.earth.scene.mode !== Cesium.SceneMode.SCENE3D) {
            return;
        }
        const icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(
            this.earth.clock.currentTime
        )
        console.log(icrfToFixed)
        // icrfToFixed 在上面的方法中,若没加载好所需的计算资源会返回undefined,判断下
        if (Cesium.defined(icrfToFixed)) {
            const camera = this.earth.camera;
            const offset = Cesium.Cartesian3.clone(camera.position)
            const transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed)
            camera.lookAtTransform(transform, offset)
        }
    }
// 添加事件监听器
addRotateSettingListener() {
   viewer.scene.postUpdate.addEventListener(rotateSetting);
}
// 移除事件监听器
removeRotateSettingListener(viewer) {
   viewer.scene.postUpdate.removeEventListener(rotateSetting);
   viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
}

调用:

chushihuaEarth(viewer);
addRotateSettingListener();

### Cesium 中实现 3D 地球自转动画 为了在 Cesium 中实现 3D 地球自转效果,可以通过设置 `Viewer` 对象的相关属性来完成。以下是具体方法: #### 创建 Viewer 并启用自动旋转 通过初始化 `Viewer` 对象并将 `shouldAnimate` 属性设为 `true`,可以激活地球的默认自转功能[^1]。 ```javascript // 初始化 Cesium Viewer 绑定到指定 HTML 元素 const viewer = new Cesium.Viewer('cesiumContainer', { shouldAnimate: true, // 启用自动动画(包括地球自转) }); ``` #### 手动控制地球自转 如果需要更精细地控制地球自转速度或方向,则可以通过修改相机的位置和角度来模拟自转效果。以下是一个手动实现地球自转的例子[^2]: ```javascript let rotationSpeed = Cesium.Math.toRadians(0.05); // 设置每帧旋转的角度(单位:弧度) function rotateEarth() { const camera = viewer.camera; const position = camera.positionCartographic; // 更新经度以实现地球自转 let newLongitude = (position.longitude - rotationSpeed); if (newLongitude < -Math.PI) { newLongitude += Math.PI * 2; // 防止越界 } const newPosition = Cesium.Cartesian3.fromDegrees( Cesium.Math.toDegrees(newLongitude), Cesium.Math.toDegrees(position.latitude), position.height ); camera.setView({ destination: newPosition, orientation: { heading: camera.heading, pitch: camera.pitch, roll: camera.roll } }); } viewer.clock.onTick.addEventListener(rotateEarth); ``` 此代码片段定义了一个函数 `rotateEarth()`,它会在每一帧更新相机位置并改变其指向的经度值,从而形成地球自转效果[^2]。 --- ### 注意事项 - 如果希望调整自转的速度,可以在变量 `rotationSpeed` 中更改数值。较大的值表示更快的自转。 - 使用 `shouldAnimate` 是一种简单的方式,但如果需要更多定制化选项,则推荐采用手动方式控制自转逻辑。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值