源码参照
https://www.wellyyss.cn/ysCesium/views/index.html
最终效果图
首先实现底部环形旋转
实现原理为添加一个圆,用一张只有一段的环形图作为其材质,通过回调函数,不断重置纹理坐标的旋转角度即可。
所用图片:
完整代码:
//取消双击事件 viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); //设置homebutton的位置 Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(110.15, 34.54, 110.25, 34.56); //Rectangle(west, south, east, north) viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(117.21579, 31.80749, 1500.0), orientation: { heading: Cesium.Math.toRadians(20.0), //左右摆 pitch: Cesium.Math.toRadians(-35.0), //正俯视 roll: 0.0 } }); var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function(e) { var cartesian = viewer.camera.pickEllipsoid(e.position, viewer.scene.globe.ellipsoid); var cartographic = Cesium.Cartographic.fromCartesian(cartesian); var lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5); //四舍五入 小数点后保留五位 var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5); //四舍五入 小数点后保留五位 // var height = Math.ceil(viewer.camera.positionCartographic.height); //获取相机高度 if (cartesian) { /** main */ var data = { layerId: "layer1", //弹窗的唯一id,英文,且唯一,内部entity会用得到 lon: lon, lat: lat, addEntity: true, //默认为false,如果为false的话就不添加实体,后面的实体属性就不需要了 boxHeight: 150, //中间立方体的高度 boxHeightDif: 5, //中间立方体的高度增长差值,越大增长越快 boxHeightMax: 300, //中间立方体的最大高度 boxSide: 40, //立方体的边长 boxMaterial: Cesium.Color.DEEPSKYBLUE.withAlpha(0.5), circleSize: 200, //大圆的大小,小圆的大小默认为一半 }; var s1 = 0.001, s2 = s1 let sStartFlog=false setTimeout(function() { console.log("延迟开放加载标志") sStartFlog = true; }, 70); var rotation = Cesium.Math.toRadians(30); function getRotationValue() { rotation += 0.05; return rotation; } viewer.entities.removeById(data.layerId + "_2"); //添加底座一 外环 viewer.entities.add({ id: data.layerId + "_2", name: "椭圆", position: Cesium.Cartesian3.fromDegrees(lon, lat), ellipse: { // semiMinorAxis :data.circleSize, //直接这个大小 会有一个闪白的材质 因为cesium材质默认是白色 所以我们先将大小设置为0 // semiMajorAxis : data.circleSize, semiMinorAxis: new Cesium.CallbackProperty(function() { if (sStartFlog) { s1 = s1 + data.circleSize / 20; if (s1 >= data.circleSize) { s1 = data.circleSize; } } return s1; }, false), semiMajorAxis: new Cesium.CallbackProperty(function() { if (sStartFlog) { s2 = s2 + data.circleSize / 20; if (s2 >= data.circleSize) { s2 = data.circleSize; } } return s2; }, false), material: "./circle2.png", //rotation: new Cesium.CallbackProperty(getRotationValue, false), stRotation: new Cesium.CallbackProperty(getRotationValue, false), zIndex: 2, } }); /** main */ } }, Cesium.ScreenSpaceEventType.LEFT_CLICK);