经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » ThingJS » 查看文章
基于Cesium实现卫星在轨绕行动画
来源:jb51  时间:2022/6/27 16:57:44  对本文有异议

这个效果其实网上很多案例了,本来不打算写了,但是做都做了,稍微来说一下吧,代码实测可用!

最后的效果就是这个样子的啦!

就是很简单的一个卫星,放射信号,然后围着轨道转圈圈。

资源网站

首先呢,分享几个网站,尽管大家应该都有,但是还是分享一下子吧。

cesium API 中文网站

3D模型下载

其中这个下载3D模型的网站有很多3D模型,可以根据自己的需要搜索下载使用,尽管大部分是收费的,但是又免费的呀,自己测试或者是玩的话,我觉得够用了,我觉得还不错的呢!

绘制卫星绕轨动效

首先这个稍微说一下哈,其实就是用了 cesium 的时间轴,然后添加卫星模型,在距离地面的固定高度按照设置好的轨迹进行绕地旋转,关于下面的锥形信号覆盖区域,就是在卫星正下方,添加绘制了一个圆柱形的模型,使得上面的圆截面半径为0,下面的圆截面半径大一些,然后就是一个锥形了,具体锥形绘制案例看我 这篇博客【穿梭门】 哈,有好多绘制形状的案例。

接下来直接上代码!!!! 其实我也是看的别的博主发的文章,然后稍作修改出来的效果,但是大体实现方式就是我上面说的。

初始化蓝星

首先要实现这个功能,一定要开启时间轴的呀,不然不好使哈!

  1. timeline: true, //是否显示时间线控件

上面这个得开起来!

  1. viewer = new Cesium.Viewer('map', {
  2. baseLayerPicker: false, // 影像切换
  3. animation: true, //是否显示动画控件
  4. infoBox: false, //是否显示点击要素之后显示的信息
  5. geocoder: false, //是否显示地名查找控件
  6. timeline: true, //是否显示时间线控件
  7. fullscreenButton: false,
  8. shouldAnimate: false,
  9. navigationHelpButton: false, //是否显示帮助信息控件
  10. terrainProvider: new Cesium.createWorldTerrain({
  11. requestWaterMask: true,
  12. requestVertexNormals: true
  13. }),
  14. imageryProvider: new Cesium.UrlTemplateImageryProvider({
  15. url: "http://mt1.google.cn/vt/lyrs=s&hl=zh-CN&x={x}&y={y}&z={z}&s=Gali"
  16. })
  17. })

添加卫星模型方法

主要是配置这个时间轴,然后就调用方法把卫星放进蓝星里面。

  1. // 卫星
  2. function satellite() {
  3. start = new Cesium.JulianDate.fromDate(new Date()); // 获取当前时间 这不是国内的时间
  4. start = Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate()); // 添加八小时,得到我们东八区的北京时间
  5. stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate()); // 设置一个结束时间,意思是360秒之后时间结束
  6.  
  7. viewer.clock.startTime = start.clone(); // 给cesium时间轴设置开始的时间,也就是上边的东八区时间
  8. viewer.clock.stopTime = stop.clone(); // 设置cesium时间轴设置结束的时间
  9. viewer.clock.currentTime = start.clone(); // 设置cesium时间轴设置当前的时间
  10. viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; // 时间结束了,再继续重复来一遍
  11. //时间变化来控制速度 // 时间速率,数字越大时间过的越快
  12. viewer.clock.multiplier = 2;
  13. //给时间线设置边界
  14. viewer.timeline.zoomTo(start, stop);
  15.  
  16. rrStates = [];
  17. getRandState(arrStates, 1);
  18. startFunc();
  19. }

相关方法

一股脑直接把代码发过来了,然后网上其实都有,我不发你也找得到,然后这些也是网上拼凑起来的,然后嘞,应该能看懂,看不懂的直接找那个 Cesium API 中文版网站去查,应该没什么难的。加油!

  1. function mySatePosition() {
  2. this.lon = 0;
  3. this.lat = 0;
  4. this.hei = 700000; //卫星高度
  5. this.phei = 700000 / 2; //轨道高度
  6. this.time = 0;
  7. }
  8.  
  9. function computeCirclularFlight(source, panduan) {
  10. var property = new Cesium.SampledPositionProperty();
  11. if (panduan == 1) { //卫星位置
  12. for (var i = 0; i < source.length; i++) {
  13. var time = Cesium.JulianDate.addSeconds(start, source[i].time, new Cesium.JulianDate);
  14. var position = Cesium.Cartesian3.fromDegrees(source[i].lon, source[i].lat, source[i].hei);
  15. // 添加位置,和时间对应
  16. property.addSample(time, position);
  17. }
  18. } else if (panduan == 2) {//轨道位置
  19. for (var i = 0; i < source.length; i++) {
  20. var time = Cesium.JulianDate.addSeconds(start, source[i].time, new Cesium.JulianDate);
  21. var position = Cesium.Cartesian3.fromDegrees(source[i].lon, source[i].lat, source[i].phei);
  22. // 添加位置,和时间对应
  23. property.addSample(time, position);
  24. }
  25. }
  26. return property;
  27. }
  28.  
  29. function getRandState(brr, count) {
  30. for (var m = 0; m < count; m++) {
  31. var arr = [];
  32. var t1 = Math.floor(Math.random() * 360);
  33. var t2 = Math.floor(Math.random() * 360);
  34. for (var i = t1; i <= 360 + t1; i += 30) {
  35. var aaa = new mySatePosition();
  36. aaa.lon = t2;
  37. aaa.lat = i;
  38. aaa.time = i - t1;
  39. arr.push(aaa);
  40. }
  41. brr.push(arr);
  42. }
  43. }
  44.  
  45. function getStatePath(aaa) {
  46. var entity_ty1p = computeCirclularFlight(aaa, 2);
  47. var entity_ty1 = viewer.entities.add({
  48. availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
  49. start: start,
  50. stop: stop
  51. })]),
  52. position: entity_ty1p, //轨道高度
  53. orientation: new Cesium.VelocityOrientationProperty(entity_ty1p),
  54. cylinder: {
  55. HeightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
  56. length: 700000,
  57. topRadius: 0,
  58. bottomRadius: 900000 / 2,
  59. // material: Cesium.Color.RED.withAlpha(.4),
  60. // outline: !0,
  61. numberOfVerticalLines: 0,
  62. // outlineColor: Cesium.Color.RED.withAlpha(.8),
  63. material: Cesium.Color.fromBytes(35, 170, 242, 80)
  64. },
  65. });
  66.  
  67. entity_ty1.position.setInterpolationOptions({
  68. interpolationDegree: 5,
  69. interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
  70. });
  71.  
  72. var entity1p = computeCirclularFlight(aaa, 1);
  73. //创建实体
  74. var entity1 = viewer.entities.add({
  75. // 将实体availability设置为与模拟时间相同的时间间隔。
  76. availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
  77. start: start,
  78. stop: stop
  79. })]),
  80. position: entity1p,//计算实体位置属性
  81. //基于位置移动自动计算方向.
  82. orientation: new Cesium.VelocityOrientationProperty(entity1p),
  83. //加载飞机模型
  84. model: {
  85. uri: './models/weixing/scene.gltf',
  86. scale: 1000
  87. },
  88. //路径
  89. path: {
  90. resolution: 1,
  91. material: new Cesium.PolylineGlowMaterialProperty({
  92. glowPower: 0.1,
  93. color: Cesium.Color.PINK
  94. }),
  95. width: 5
  96. }
  97. });
  98.  
  99. //差值器
  100. entity1.position.setInterpolationOptions({
  101. interpolationDegree: 5,
  102. interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
  103. });
  104. }
  105.  
  106. function startFunc() {
  107. for (var i = 0; i < arrStates.length; i++) {
  108. getStatePath(arrStates[i]);
  109. }
  110. }

到此这篇关于基于Cesium实现卫星在轨绕行动画的文章就介绍到这了,更多相关Cesium卫星在轨绕行动画内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

ThingJS热门文章

  • 基于Cesium实现卫星在轨绕行动画

  • ThingJS推荐文章

    本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

    W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
    关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
    皖ICP备17017327号-2 皖公网安备34020702000426号