Cesium半椭球体面的生成思路

Cesium提供了两种方式让使用着加载自己所需要的几何图形,分别是Entity和Primitive。前者是一些已经封装好的接口,可以很方面的添加点、线、面、矩形、椭球体、圆柱体等形状。对于一些意见的使用来说,Entity接口可以用极少量的代码就可以实现所需要的功能。另外一种则是Primitive,相比Entity来说,这种方式需要使用者对Cesium有着更深层次的理解,因为在Primitive中我们可以添加自定义的形状如:半椭球体,扇形等等形状。本文的重点主要讲解通过primitive添加半椭球体。

有的读者可能这么认为,半椭球体就是整个椭球体的一半,通过Cesium封装的EllipsoidGraphics接口参数中高度值进行设置,将椭球体的下半部分隐藏在球体中,就可以实现半椭球形状。实际上这种方式思想上有一定的借鉴性,但是在实际的使用却是万万不能这么做的,说这种方式在思想上有借鉴性的原因将会在后面进行介绍。现在,我们需要重新明确一下需求,我们所要做的椭球体是可以有离地高度的,这样以来通过EllipsoidGraphics接口来实现的方法就不能满足我们的需求了。在这种情况下,我们就需要思考到底有哪些可行的技术方案:

首先,通过Entity中的PolygonGraphic接口进行实现。这里我们可以将椭球体表面作为面对象而进行绘制。但是这样做的画有以下几点需要考虑,椭球面的划分,椭球面点坐标计算,椭球面点坐标的排列。这三个问题摆在我们面前其实意见相当的复杂了。笔者层沿着这条路进行了一段时间,虽然有一定的效果,但是由于计算过程的复杂性还是转而思考别的实现方式。

通过Primitive接口进行实现,这里的一些经验可以借鉴https://my.oschina.net/luosongMZ/blog/284363所提供的一些经验,但是有些地方我们需要注意,在Primitive构造方法中需要将asynchronous参数设置为false,这样才正确的将图形进行显示。关于这个参数的介绍将会在后续的文章进行介绍。通过以上的示例,我发现可以将椭球面进行三角网格划分,再通过对这些三角网格进行绘制以实现半椭球体面的绘制方案。

此时,我们就需要通过椭球体的参数方程,通过在z,y,z方向上的角度将椭球面划分成一定的三角网格,通过参数方程构造的椭球面坐标实际上是以坐标原点为球心的,这个时候我们就需要对这个坐标进行坐标变换。有两种方式对椭球体进行变化,一种方式是再生成点坐标的时候对每个点都进行坐标变换,另一种方式是通过生成的geometryinstance通过设置变换矩阵参数来进行整体偏移旋转,实践证明这两种方法都是可行的,具体采用哪种方法则看具体需要了。

话复前言,上面提到的通过EllipsoidGraphics接口进行实现的借鉴意义就在于可以参考其生成EllipsoidGeometry的方法,在Cesium中有EllipsoidGeometry接口,接口中有createGeometry方法,通过查看源码可以找到其中有很大一部分可以参考的地方,在最终生成Geometry中有两个重要的参数positions和indices,其中前者存放了所有节点的坐标信息,这里需要注意的是,positions中存放的是单个数值数组,所有点的x,y,z坐标都会存放在这个数组里,通过定义的组件个数为3,系统会自动将数组中连续的三个值读作一个点的坐标。indices中则存储了节点索引顺序,这里如果看不懂的话则需要再思考一下,这里是生成半椭球面,以及理解整个cesium绘制的重要一环。通过这中方式生成的geometry可以直接通过geometryinstance在primitive中进行绘制。

猜你喜欢

转载自blog.csdn.net/haochajin/article/details/83062925