Cesium实现地球自转明暗分割,类似官网封面效果

这几天博主没事看Cesium官网的时候,觉得首页的地球自转效果就很炫酷,想着自己也做一个,奈何想不到思路,在CSDN和stackoverflow上也没有找到类似的功能,所以就只能自己造轮子了,这个效果在大屏展示上的效果很不错,希望感兴趣的老哥们和我一起想想办法。
在这里插入图片描述
这个就是首页的地球,它是可以转动的。
目前的思路,采用Cesium自带的卷帘分析,一面是谷歌影像,一面是夜景ION,然后实现一个自转的功能。

卷帘分析代码

 var viewer = new Cesium.Viewer("cesiumContainer", {
            animation: false,  //是否显示动画控件
            timeline: false, //是否显示时间线控件
            imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
                url: "http://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0" +
                    "&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
                    "&style=default&format=tiles&tk=你的天地图Key", //矢量地图
                // url: TDTURL_CONFIG.TDT_IMG_C,
                layer: "tdtImg_c",
                style: "default",
                format: "tiles",
                tileMatrixSetID: "c",
                subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
                tilingScheme: new Cesium.GeographicTilingScheme(),
                tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"],
                maximumLevel: 18,
                show: false
            }),
            baseLayerPicker: false,
            infoBox: false,
        });
 
        //天地图影像中文标记服务(经纬度)
        var layer = viewer.imageryLayers.addImageryProvider(
            new Cesium.IonImageryProvider({ assetId: 3812 })
        );
        var layers = viewer.imageryLayers;
        // layers.addImageryProvider(tdtCva)
        var tdtVec = new Cesium.WebMapTileServiceImageryProvider({
          url: "http://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0" +
                    "&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
                    "&style=default&format=tiles&tk=你的天地图Key", //矢量地图
                layer: "tdtCva",
          style: "default",
          format: "tiles",
          tileMatrixSetID: "c",
          subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
          tilingScheme: new Cesium.GeographicTilingScheme(),
          tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"],
          maximumLevel: 18,
          show: false
      });
        var earthAtNight = layers.addImageryProvider(
            tdtVec
        );
        earthAtNight.splitDirection = Cesium.ImagerySplitDirection.LEFT; // Only show to the left of the slider.

        // Sync the position of the slider with the split position
        var slider = document.getElementById("slider");
        viewer.scene.imagerySplitPosition =
            slider.offsetLeft / slider.parentElement.offsetWidth;

        var handler = new Cesium.ScreenSpaceEventHandler(slider);

        var moveActive = false;

        function move(movement) {
            if (!moveActive) {
                return;
            }

            var relativeOffset = movement.endPosition.x;
            var splitPosition =
                (slider.offsetLeft + relativeOffset) /
                slider.parentElement.offsetWidth;
            slider.style.left = 100.0 * splitPosition + "%";
            viewer.scene.imagerySplitPosition = splitPosition;
        }

        handler.setInputAction(function () {
            moveActive = true;
        }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
        handler.setInputAction(function () {
            moveActive = true;
        }, Cesium.ScreenSpaceEventType.PINCH_START);

        handler.setInputAction(move, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
        handler.setInputAction(move, Cesium.ScreenSpaceEventType.PINCH_MOVE);

        handler.setInputAction(function () {
            moveActive = false;
        }, Cesium.ScreenSpaceEventType.LEFT_UP);
        handler.setInputAction(function () {
            moveActive = false;
        }, Cesium.ScreenSpaceEventType.PINCH_END);

地球自转实现

        // var viewer = new Cesium.Viewer("cesiumContainer");
        viewer._cesiumWidget._creditContainer.style.display = "none";
        viewer.clock.multiplier = 60;//速度
        viewer.clock.shouldAnimate = true;
        var previousTime = viewer.clock.currentTime.secondsOfDay;

        //地租自转事件
        function onTickCallback() {
            var spinRate = 1;
            var currentTime = viewer.clock.currentTime.secondsOfDay;
            var delta = (currentTime - previousTime) / 1000;
            previousTime = currentTime;
            viewer.scene.camera.rotate(Cesium.Cartesian3.UNIT_Z, -spinRate * delta);
        }
        viewer.clock.onTick.addEventListener(onTickCallback);

在这里插入图片描述

更新了伙计们


今天有时间就又研究了一波,在网上看到了一个原理,也就是明暗分割的新思路,其实就是用cesium自带的光照系统,打开这个配置之后,就会有给图层一个部分有光,部分无光照的效果,其中里面的参数就是有让图层的白天区域或者黑夜区域的透明度调节发生变化。
综上这些思路,就可以利用这个白天黑夜的透明度变化以及时间变化来完成明暗交接。
摒弃上面的代码,在加入天地图代码后,直接加入以下代码

    updateLighting(viewer);

    function updateLighting(_viewer) {
      viewer.scene.globe.enableLighting = true//必须开启光照效果,
      var layer = viewer.scene.imageryLayers.addImageryProvider(
        new Cesium.SingleTileImageryProvider({
          url: '../../data/img/night.jpg'
        })
      )
      layer.dayAlpha = 0.0 //白天图层透明值
      layer.nightAlpha = 1.0 //夜晚图层透明值
      layer.brightness = 3.5 //图层发光亮度

      _viewer.scene.globe.enableLighting = true;//打开光照
      _viewer.clock.shouldAnimate = true;//时间轴动画
      _viewer.clock.multiplier = 2000;//时间轴速度
      // nightLayer.dayAlpha = 0.0;
    }

效果如下
在这里插入图片描述
实现是实现了,就是背景也一直在转,转的人头晕,后续再改进改进

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Cesium是一个用于创建地球、地图和空间可视化的开源JavaScript库。要设置地球自转,可以使用Cesium提供的`Clock`对象和`ClockViewModel`对象来控制时间和动画效果。 首先,你需要创建一个`Clock`对象来管理时间。`Clock`对象包含了当前时间、速度和是否暂停等属性。你可以通过设置`Clock.currentTime`属性来改变当前时间。 然后,你可以创建一个`ClockViewModel`对象来控制动画效果。`ClockViewModel`对象提供了一些方便的方法和属性来控制时间的流逝和动画的播放。你可以通过设置`ClockViewModel.clock`属性来关联到之前创建的`Clock`对象。 接下来,你可以使用Cesium的实体对象(例如`Entity`)来表示地球,并设置其旋转角度。你可以通过设置实体对象的`orientation`属性来实现地球自转。例如,你可以使用`Quaternion`对象来表示旋转角度,并将其赋值给实体对象的`orientation`属性。 最后,你需要在Cesium的场景中添加这个实体对象,并启动Cesium的渲染循环,让地球开始自转。 下面是一个示例代码,展示了如何使用Cesium设置地球自转: ```javascript // 创建一个Clock对象 var clock = new Cesium.Clock(); // 创建一个ClockViewModel对象,并关联到Clock对象 var clockViewModel = new Cesium.ClockViewModel(clock); // 创建一个实体对象表示地球 var earthEntity = new Cesium.Entity({ name: 'Earth', position: Cesium.Cartesian3.fromDegrees(0, 0, 0), orientation: Cesium.Quaternion.IDENTITY, // 初始旋转角度为单位四元数 model: { uri: 'path/to/earth/model' // 地球模型的路径 } }); // 将实体对象添加到场景中 viewer.scene.primitives.add(earthEntity); // 启动Cesium的渲染循环 viewer.clockViewModel = clockViewModel; viewer.clock.shouldAnimate = true; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值