Cesium之Primitive相关探索

Primitive:
它代表着场景(scene)中的几何体,这个几何体可以是一个几何实例,或者由一组几何实例合并而成,即便它们是不同种类的几何体,例如一个矩形和一个椭球。
primitive通过把几何体和外观进行解耦,能够让我们混合和匹配他们中的大多数来添加一个新的几何体,或者彼此独立的外观。
它主要由两部分组成:
①.几何实例(GeometryInstance):定义了primitive的结构布局,例如三角形 、线条、点等;
②.外观(appearance):定义了primitive的视觉特征,包括材质和渲染状态。
将多个几何实例结合成一个primitive的过程叫做“合并(batching )”,而且大大提高了加载静态数据的性能。这些实例可以被单独选择,通过使用像“ PerInstanceColorAppearance”的这种perinstance appearance,可以使每个实例拥有不同的颜色。
几何体( Geometry )能够在一个web worker(HTML5提供的一个js多线程解决方案,我们可以将一些大计算量的代码交由web worker运行)或者主线程中创建和合并。下面的创建geometry的方法就是由web worker执行的,若想在主线程中创建,那么通过 createGeometry 方法来创建。

//将多个几何实例结合成一个primitive
var rectangleInstance = new Cesium.GeometryInstance({
  geometry : new Cesium.RectangleGeometry({
    rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0),
    vertexFormat : Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
  }),
  id : 'rectangle',
  attributes : {
    color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5)
  }
});
var ellipsoidInstance = new Cesium.GeometryInstance({
  geometry : new Cesium.EllipsoidGeometry({
    radii : new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0),
    vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL
  }),
  modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
    Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 500000.0), new Cesium.Matrix4()),
  id : 'ellipsoid',
  attributes : {
    color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
  }
});
scene.primitives.add(new Cesium.Primitive({
  geometryInstances : [rectangleInstance, ellipsoidInstance],
  appearance : new Cesium.PerInstanceColorAppearance()
}));

接下来看一下GeometryInstance和apperance:
几何实例(GeometryInstance )就是将一个几何对象能够赋予不同的位置而且拥有唯一的颜色。例如,一个盒子( BoxGeometry )能够被实例化许多个,每一个实例都可以有一个不同的模型矩阵( modelMatrix)来改变它的位置、旋转和比例。这里的attributes属性只能添加GeometryInstance 的属性,也就是ColorGeometryInstanceAttribute和ShowGeometryInstanceAttribute。

var geometry = Cesium.BoxGeometry.fromDimensions({
  vertexFormat : Cesium.VertexFormat.POSITION_AND_NORMAL,
  dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 500000.0)
});
var instanceBottom = new Cesium.GeometryInstance({
  geometry : geometry,
  modelMatrix : Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
    Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0, 1000000.0), new Cesium.Matrix4()),
  attributes : {
    color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
  },
  id : 'bottom'
});

外观(appearance )
一个appearance定义了整个GLSL顶点、片段着色器和渲染状态。
它分为多种
- MaterialAppearance
- EllipsoidSurfaceAppearance
- PerInstanceColorAppearance
- DebugAppearance
- PolylineColorAppearance
- PolylineMaterialAppearance

继续深入,探索几何体(Geometry )
在API文档上是这么描述的:
A geometry representation with attributes forming vertices and optional index data defining primitives. Geometries and an Appearance, which describes the shading, can be assigned to a Primitive for visualization. A Primitive can be created from many heterogeneous - in many cases - geometries for performance.
意思是一个geometry表示了形成一个primitive的属性,它用来形成顶点和可选索引数据。几何体和一个外观属性,用来描述着色,被安排用作primitive的可视化。一个primitive有多种形成方式,在很多情况下,geometry是最具性能的。(感觉翻译很吃力,怕有误。。。)
geometry可以通过GeometryPipeline里面的方法来进行转换和优化。

geometry分为:

  • PolylineGeometry
  • PolygonGeometry
  • RectangleGeometry
  • EllipseGeometry
  • CircleGeometry
  • WallGeometry
  • SimplePolylineGeometry
  • BoxGeometry
  • EllipsoidGeometry

均可以通过他们的构造方法来生成不同的geometry。

tips;在各个geometry的属性里面,有一个vertexFormat属性,这是要计算的顶点的属性,有多种方式方式可选,默认是Cesium.VertexFormat.DEFAULT,但是我在生成polylineGeometry的时候采用默认方式并不能出现,于是用的Cesium.PolylineColorAppearance.VERTEX_FORMAT才得以出现,例子如下

// A solid white line segment
var primitive = new Cesium.Primitive({
  geometryInstances : new Cesium.GeometryInstance({
    geometry : new Cesium.PolylineGeometry({
      positions : Cesium.Cartesian3.fromDegreesArray([
        0.0, 0.0,
        5.0, 0.0
      ]),
      width : 10.0,
      vertexFormat : Cesium.PolylineColorAppearance.VERTEX_FORMAT
    }),
    attributes : {
      color : Cesium.ColorGeometryInstanceAttribute.fromColor(new Cesium.Color(1.0, 1.0, 1.0, 1.0))
    }
  }),
  appearance : new Cesium.PolylineColorAppearance({
    translucent : false
  })});

原来是primitive的外观采用的是PolylineColorAppearance,它是线几何实例的颜色属性,它的作用是允许多个几何实例,在同一个primitive里面有不同的颜色,所以vertexFormat应该采用PolylineColorAppearance的顶点格式。

你可能感兴趣的:(cesium,webgl)