Cesium创建geometry(一)

Cesium封装了PolygonGeometry、RectangleGeometry、EllipseGeometry等​​​​​多种类型的geometry供用户使用。本文则根据官网已有案例进行整合,利用primitive展示各种geometry的具体使用方法

1.PolygonGeometry

1.1根据点坐标创建polygon

(1)Cesium.PolygonGeometry类型提供了polygonHierarchy属性,对应Cesium.PolygonHierarchy实例,

(2)Cesium.PolygonGeometry常用于构建复杂的多边形,例如带有内部孔洞或嵌套多边形的几何体

(3)创建Cesium.PolygonHierarchy实例需要传入一组坐标,多边行的外部轮廓坐标按照逆时针顺序,内部轮廓按照顺时针顺序

  let polygon = new Cesium.PolygonGeometry({
    polygonHierarchy : new Cesium.PolygonHierarchy(
      Cesium.Cartesian3.fromDegreesArray([
        //逆时针设置点
        -72.0, 40.0,
        -75.0, 30.0,
        -70.0, 30.0,
        -68.0, 40.0
      ])
    )
  });

创建一个 PolygonGeometry 实例,并将其作为几何实例(GeometryInstance)添加到 Cesium 场景(以下几何实例类似)

  const geometry = Cesium.PolygonGeometry.createGeometry(polygon);
  let geometryInstance = new Cesium.GeometryInstance({
      geometry:geometry,
      //modelMatrix:modelMatrix
  })
1.2创建带孔的嵌套多边形

创建带孔的嵌套多边形,与上述创建多边形区别是需要在Cesium.PolygonHierarchy中嵌套Cesium.PolygonHierarchy,外部轮廓按照逆时针,内部轮廓按照顺时针

  const polygonWithHole = new Cesium.PolygonGeometry({
    polygonHierarchy: new Cesium.PolygonHierarchy(
      Cesium.Cartesian3.fromDegreesArray([
        -109.0, 30.0,
        -95.0, 30.0,
        -95.0, 40.0,
        -109.0, 40.0
      ]),
      [new Cesium.PolygonHierarchy(
        Cesium.Cartesian3.fromDegreesArray([
          -107.0, 31.0,
          -107.0, 39.0,
          -97.0, 39.0,
          -97.0, 31.0
        ]),
        [new Cesium.PolygonHierarchy(
          Cesium.Cartesian3.fromDegreesArray([
            -105.0, 33.0,
            -99.0, 33.0,
            -99.0, 37.0,
            -105.0, 37.0
          ]),
          [new Cesium.PolygonHierarchy(
            Cesium.Cartesian3.fromDegreesArray([
              -103.0, 34.0,
              -101.0, 34.0,
              -101.0, 36.0,
              -103.0, 36.0
            ])
          )]
        )]
      )]
    )
  })

  const geometry2 = Cesium.PolygonGeometry.createGeometry(polygonWithHole);
  let geometryInstance2 = new Cesium.GeometryInstance({
      geometry:geometry2,
      //modelMatrix:modelMatrix
  })
1.3创建一个挤压高度的多边形

创建挤压高度的多边形需要额外添加extrudedHeight属性,用来设置多边行的高度

  const extrudedPolygon = new Cesium.PolygonGeometry({
    polygonHierarchy: new Cesium.PolygonHierarchy(
      Cesium.Cartesian3.fromDegreesArray([
        -72.0, 40.0,
        -70.0, 35.0,
        -75.0, 30.0,
        -70.0, 30.0,
        -68.0, 40.0
      ])
    ),
    extrudedHeight: 300000,
  })

  let geometry3 = Cesium.PolygonGeometry.createGeometry(extrudedPolygon)
  let geometryInstance3 = new Cesium.GeometryInstance({
    geometry: geometry3
  })

将上述创建的所有多边形实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // polygon
    geometryInstances:[geometryInstance,geometryInstance2,geometryInstance3],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

2.RectangleGeometry

2.1创建矩形

矩形几何类型通过Cesium.RectangleGeometry创建实例。其中使用了ellipsoid、rectangle、height三个属性

(1)ellipsoid:指定矩形几何体所对应的椭球体模型,这里使用Cesium.Ellipsoid.default(即 WGS84 椭球)

(2)rectangle:定义矩形的经纬度范围,使用四个参数(两个对角的坐标点,即左下角和右上角)

(3)height:设置矩形的高度,即距离椭球体表面的高度(以米为单位)

  const rectangle = new Cesium.RectangleGeometry({
    ellipsoid: Cesium.Ellipsoid.default,
    rectangle: Cesium.Rectangle.fromDegrees(-88.0,39.0,-82.0,42.0),
    height: 10000.0
  })
  const geometryRec1 = Cesium.RectangleGeometry.createGeometry(rectangle)
  const geometryInstanceRec1 = new Cesium.GeometryInstance({
    geometry: geometryRec1
  })
2.2创建具有挤压高度的矩形

创建挤压高度的矩形与上述矩形的区别是额外添加了extrudedHeight属性,用来设置挤压高度

  const extrudedRectangle = new Cesium.RectangleGeometry({
    ellipsoid:Cesium.Ellipsoid.default,
    rectangle: Cesium.Rectangle.fromDegrees(-80.0,39.0,-74.0,42.0),
    height: 10000.0,
    extrudedHeight: 300000
  })
  const geometryRec2 = Cesium.RectangleGeometry.createGeometry(extrudedRectangle)
  const geometryInstanceRec2 = new Cesium.GeometryInstance({
    geometry:geometryRec2
  })

将上述创建的所有矩形实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // rectangle
    geometryInstances:[geometryInstanceRec1,geometryInstanceRec2],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

3.EllipseGeometry

椭圆几何类型通过Cesium.EllipseGeometry创建实例,主要包括center、semiMajorAxis、semiMinorAxis、rotation四个属性

(1)center:定义椭圆的中心位置

(2)semiMajorAxis:定义椭圆的长半轴

(3)semiMinorAxis:定义椭圆的短半轴

(4)rotation:定义椭圆的旋转角度

  const ellipse = new Cesium.EllipseGeometry({
    center: Cesium.Cartesian3.fromDegrees(-75.59,40.03),
    semiMajorAxis: 500000.0,
    semiMinorAxis: 300000.0,
    rotation: Cesium.Math.toRadians(60.0)
  })
  const geometry_ellipse = Cesium.EllipseGeometry.createGeometry(ellipse)
  const geometryInstance_ellipse = new Cesium.GeometryInstance({
    geometry:geometry_ellipse
  })

将上述创建的椭圆实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // ellipse
    geometryInstances:[geometryInstanceEllipse],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

4.CircleGeometry

圆形几何类型通过Cesium.CircleGeometry创建实例,主要包括center、radius两个属性

(1)center:设置圆形几何类型的中心点

(2)radius:设置半径长度

  const circle = new Cesium.CircleGeometry({
    center: Cesium.Cartesian3.fromDegrees(-75.59,40.03),
    radius: 100000.0
  })
  const geometryCircle = Cesium.CircleGeometry.createGeometry(circle)
  const geometryInstanceCircle = new Cesium.GeometryInstance({
    geometry:geometryCircle
  })

将上述创建的圆形实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // circle
    geometryInstances:[geometryInstanceCircle],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

5.WallGeometry

墙体几何类型通过Cesium.WallGeometry创建实例,该实例需要传入一个positions属性,该属性对应Cesium.Cartesian3.fromDegreesArrayHeights方法,需要传入墙体的坐标和高度

  const wall = new Cesium.WallGeometry({
    positions: Cesium.Cartesian3.fromDegreesArrayHeights([
      19.0,47.0,10000.0,
      19.0,48.0,10000.0,
      20.0,48.0,10000.0,
      20.0,47.0,10000.0,
      19.0,47.0,10000.0,
    ])
  })
  const geometryWall = Cesium.WallGeometry.createGeometry(wall)
  const geometryInstanceWall = new Cesium.GeometryInstance({
    geometry:geometryWall
  })

将上述创建的圆形实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // wall
    geometryInstances:[geometryInstanceWall],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

6.SimplePolylineGeometry

简单线几何类型通过Cesium.SimplePolylineGeometry创建实例,该实例需要传入一个positions属性,该属性对应Cesium.Cartesian3.fromDegreesArray方法,需要传入线段的坐标

  const polyline = new Cesium.SimplePolylineGeometry({
    positions: Cesium.Cartesian3.fromDegreesArray([
      116.0,38.0,
      112.0,40.0,
      110.0,30.0
    ]),
  })
  const geometryPolyline = Cesium.SimplePolylineGeometry.createGeometry(polyline)
  const geometryInstancePolyline = new Cesium.GeometryInstance({
    geometry: geometryPolyline
  })

将上述创建的实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // simple polyline
    geometryInstances:[geometryInstancePolyline],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

7.BoxGeometry

立方体或正方体几何类型通过Cesium.BoxGeometry创建实例,该实例创建需要传入vertexFormat、maximum、minimum三个参数

(1)vertexFormat:指定顶点格式,Cesium.VertexFormat.POSITION_ONLY表示只使用顶点位置,不包含法线、纹理坐标、颜色等其他顶点属性

(2)maximum:定义了立方体的最大坐标,表示在三个轴(x, y, z)上的最大值

(3)minimum:定义了立方体的最小坐标,表示在三个轴(x, y, z)上的最小值

  const box = new Cesium.BoxGeometry({
    vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
    maximum: new Cesium.Cartesian3(250000.0,250000.0,250000.0),
    minimum: new Cesium.Cartesian3(-1000000.0,-1000000.0,-1000000.0)
  })

这里在创建Cesium.GeometryInstance实例过程中,需要设置modelMatrix属性,用来设置变换矩阵,将BoxGeometry放到指定经纬度位置,如果不设置会显示在地球内部。

  const geometryBox = Cesium.BoxGeometry.createGeometry(box)
  const geometryInstanceBox = new Cesium.GeometryInstance({
    geometry:geometryBox,
    modelMatrix: Cesium.Matrix4.multiplyByTranslation(
      // 生成了一个以指定经纬度位置为中心的变换矩阵
        Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)),
        // 将物体从指定的经纬度点向上平移 250000 米
        new Cesium.Cartesian3(0.0, 0.0, 250000.0),
        // 存储组合后的结果
        new Cesium.Matrix4()
    )
  })

将上述创建的实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // box
    geometryInstances: [geometryInstanceBox],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

8.EllipsoidGeometry

椭圆体几何类型通过Cesium.BoxGeometry创建实例,该实例创建需要传入vertexFormat、radii两个参数。

vertexFormat和上述创建BoxGeometry属性类似,radii属性则是表示椭球体在 x、y、z 三个轴上的半径。

  const ellipsoid = new Cesium.EllipsoidGeometry({
    vertexFormat: Cesium.VertexFormat.POSITION_ONLY,
    radii: new Cesium.Cartesian3(1000000.0,500000.0,500000.0),
  })

这里在创建Cesium.GeometryInstance实例过程中,同样需要设置modelMatrix属性,用来设置变换矩阵,将EllipsoidGeometry放到指定经纬度位置,如果不设置会显示在地球内部。

  const geometryEllipsoid = Cesium.EllipsoidGeometry.createGeometry(ellipsoid)
  const geometryInstanceEllipsoid = new Cesium.GeometryInstance({
    geometry:geometryEllipsoid,
    modelMatrix: Cesium.Matrix4.multiplyByTranslation(
      // 生成了一个以指定经纬度位置为中心的变换矩阵
        Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883)),
        // 将物体从指定的经纬度点向上平移 250000 米
        new Cesium.Cartesian3(0.0, 0.0, 250000.0),
        // 存储组合后的结果
        new Cesium.Matrix4()
    )
  })

将上述创建的实例,利用primitive添加到Cesium场景中

  let primitive = viewer.scene.primitives.add(new Cesium.Primitive({
    // ellipsoid
    geometryInstances: [geometryInstanceEllipsoid],
    //外观
    appearance: new Cesium.MaterialAppearance({
      material: Cesium.Material.fromType('Color', {
        color: Cesium.Color.RED  // 设置颜色
      }),
      flat: true,  // 使外观平坦
      translucent: false //不设置透明度
    }),
    //同步加载,会立即创建并显示该几何体
    asynchronous: false
  }))

添加结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值