cesium 模拟地球自转

cesium 模拟地球自转

cesium 现有的机制分析

默认情况下,cesium 的球体其实在三维中是保持静止的状态。

而随着时间的流逝,默认的背景星空,是在不断地旋转的。

这个逻辑,我们从 cesium 的源码中就能发现端倪。

cesium 的 Scene 对象中,有个 render 方法,每一帧都被会调用,用于场景的重绘。
在这里插入图片描述

而 render 中有个 updateEnvironment 方法,用于更新环境
在这里插入图片描述

updateEnvironment 方法中,有一段更新 skyBox 的代码,同时我们能看到的是,同样有一段更新太阳和月亮位置的代码。
在这里插入图片描述

所以说,默认情况下,cesium 框架内部,通过计算,以地球为中心,真实的模拟了地球的运动。

产生地球自转可行的方案

如果现在有需求,想要实现地球自转的效果,那么我们该如何处理呢?

变与不变,其实是相对的。

所以其实我们有两种方案解决地球转动的问题:

  1. 地球球体自身旋转
  2. 旋转相机,产生自转的效果

旋转地球自身

先来讨论下我们的第一种方案。

如果我们想旋转地球自身的话,其实并不现实。

整个球包含着一套地理信息,而地理信息与实际的三维坐标信息并不一致,是有一套专门的转换机制的。

如果地球一转,就会使得三维坐标发生了变化,但是地理坐标却保持不变,如果还想使坐标对应,就必须要更新这套转换机制了。

这种做法显然是比较麻烦的。

我们知道,cesium 默认内置了一些三维对象的实现,比如 cylinder、plane、wall 等。

但是这些对象一般不是直接添加到 3d 场景中去的,而是通过附着在一个 entity 上添加的。

而且 entity 想要进行旋转操作,其实蛮复杂,必须要改变 orientation 值。

说实话,这个对新手及其不友好。

尤其是之前用过类似于 three.js 类似框架的童鞋,习惯了用 rotate 方式去旋转,但是用上 cesium 就犯难了,很难轻易的弄清楚,这个 orientation 该如何去写。

如果你查文档的话,文档也只会告诉你,这个 orientation 接受一个 Property 属性或者 undefined。
在这里插入图片描述

作为一枚新手,会让你一头雾水,特别是 cesium 里面的这个 Property,你刚接触还并不太好理解。

在这里插入图片描述

我们看看定义,大概能明白这是个什么东西。

其能够包含一组随着时间变化的值,也就是不同的时间,可以应用上不同的值。

这个功能很强大,特别是,当你了解到,原来 cesium 里面内置了一套系统时间的时候,就能感受到这么设计的魅力所在了。

咳咳,有点扯远了。

总之这种方案,如果放在其他的系统上,着实是可行的,就是麻烦了点。

但是放在地球上,显然是不太能行得通的方案。

旋转相机,产生自转的错觉

既然经过我们的分析,感觉第一种方案,过于复杂,那么现在我们来分析一下第二种方案,是否能够很好的满足我们的需求。

我们大家都知道的一个物理的基本原理是,运动是相对的。

所以,假使地球不转,我们视角(也就是这里的相机)反向转动,是能够模拟出地球转动的效果的。

那么相机,到底好不好进行旋转操作呢?

或者说的具体点,cesium 里面有没有提供这种 api,方便我们进行操作呢?

答案是肯定的!

不然,我也不会写这篇文章了。

需要注意的是,由于 cesium 支持多种视图模式,所以我们还需要针对不同的情况分别进行讨论,不能一概而论。

1. 哥伦布视图

对于哥伦布视图,讨论旋转好像没啥意义。

本身就是个 2.5 D 的视图,我很难想象,什么应用场景下,需要用到该视图模拟地球的旋转。

所以,这一块我们就先不考虑了。

2. 2d视图

由于 cesium 的球处于2d模式的时候,也是能够进行旋转缩放操作的。

因此,为了合理性,我们只考虑我们的 2d 视图一直处于类似初始化时候的平铺状态。
在这里插入图片描述

由于,cesium 2d 平面状态的时候,做了连续向左向右无限滚动的处理,因此,我们完全是可以采用平移镜头,而模拟地球自转的效果的。

刚好,cesium 的 camera 也提供了 moveLeftmoveRight api, 可以刚好用在这个地方,起到平移镜头的作用。

为了模拟真实的自转,有几点是我们需要考虑的问题。

  • 系统时间ÿ
### 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` 是一种简单的方式,但如果需要更多定制化选项,则推荐采用手动方式控制自转逻辑。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值