Cesium贴地设置

Cesium贴地设置

1.primitive贴地线

Cesium对primitive线有专门的GroundPolylinePrimitive贴地线primitive和GroundPolylineGeometry贴地线几何

viewer.scene.primitives.add(
new Cesium.GroundPolylinePrimitive({//贴地primitive线
      geometryInstances: new Cesium.GeometryInstance({
        geometry: new Cesium.GroundPolylineGeometry({//贴地线几何
          positions:Cesium.Cartesian3.fromDegreesArray([90, 28, 100, 28])
        })
      }),
      appearance: new Cesium.PolylineMaterialAppearance({
        material: Cesium.Material.fromType('Color', {
          color: Cesium.Color.RED
        })
      })
    })
    )

2.CircleGeometry,CorridorGeometry,EllipseGeometry,PolygonGeometry,和RectangleGeometry设置贴地,Cesium提供GroundPrimitive类,实现对以上几何图形设置贴地,对于立体几何图形不支持贴地

在这里插入图片描述

var primitive = new Cesium.GroundPrimitive({//贴地的primitive
        geometryInstances: new Cesium.GeometryInstance({
          geometry: new Cesium.PolygonGeometry({//支持CircleGeometry,CorridorGeometry,EllipseGeometry,RectangleGeometry
            polygonHierarchy: new Cesium.PolygonHierarchy([
              Cesium.Cartesian3.fromDegreesArray(100,25,100,30,110,30)
            ])
          }),
          attributes: {
            color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED)
          }
        }),
        appearance: new Cesium.PerInstanceColorAppearance()
      })
viewer.scene.primitives.add(primitive)

3.PointPrimitive设置贴地

在没有地形的情况下设置笛卡尔的高度为0就是贴地,有地形就需要使用到Cesium提供的sampleTerrainMostDetailed方法实现点位置添加高程实现贴地,

var cartesian=Cesium.Cartesian3.fromDegrees(100,20)//这里没设置点的高度,也可以设置高度,但不知道该位置的高程,所以需要使用sampleTerrainMostDetailed方法在地形加载出来后,将该点位置赋予高程
	var points = window.viewer.scene.primitives.add(new Cesium.PointPrimitiveCollection())
	var ellipsoid = window.viewer.scene.globe.ellipsoid
	let p = ellipsoid.cartesianToCartographic(cartesian)
          let promise = Cesium.sampleTerrainMostDetailed(window.viewer.terrainProvider, [p])
          Cesium.when(promise, function() {
            points.add({
              position: Cesium.Cartographic.toCartesian(p),
              color: Cesium.Color.WHITE,
              pixelSize: 10
            })
          })

4.Entity实体设置贴地

大部分entity有HeightReference高度参考属性,设置为CLAMP_TO_GROUND贴地类型可设置贴地

window.viewer.entities.add({
            polygon: {//box,ellipse,cylinder.......
              hierarchy: Cesium.Cartesian3.fromDegreesArray(100,25,100,30,110,30),
              material: Cesium.Color.GREEN,
              heightReference: Cesium.HeightReference.CLAMP_TO_GROUND//设置HeightReference高度参考类型为CLAMP_TO_GROUND贴地类型
            }
          })

5.model模型设置贴地

用Entity的加载方式添加模型同上只要叫上高度参考就好,如果用primitive的方式加载模型,则同点原语一样要将模型中心点贴合地面,或者通过模型矩阵改变位置

//entity方式
viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(117, 25),
        model: {
          uri: 'Models/my_city_0.glb',
          minimumPixelSize: 48,
           heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
        }
      })
//primitive方式
var position = Cesium.Cartesian3.fromDegrees(109.02, 34.02, 0)
	let p = ellipsoid.cartesianToCartographic(position )
          let promise = Cesium.sampleTerrainMostDetailed(window.viewer.terrainProvider, [p])
          Cesium.when(promise, function() {
		  var hpRoll = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(45), 0, 0)
		      var fixedFrame = Cesium.Transforms.localFrameToFixedFrameGenerator('north', 'west')
		      var scene = viewer.scene
		      scene.primitives.add(
		        Cesium.Model.fromGltf({
		          url: 'Models/Cesium_Air.gltf',
		          modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(Cesium.Cartographic.toCartesian(p), hpRoll, Cesium.Ellipsoid.WGS84, fixedFrame, position),
		          minimumPixelSize: 128,
		          maximumScale: 200,
		        })
		      )
})
    

6.3dTiles设置贴地

3dtiles初始的位置在加载了地形后可能位于地形下方,通过调整模型高度让tiles位于地表上,这里高度设定的固定值,也可以通过上边的sampleTerrainMostDetailed获取到实际的高程再调整

var tileset = window.viewer.scene.primitives.add(
        new Cesium.Cesium3DTileset({
          url: 'Tileset/tileset.json'
        })
      )
      tileset.readyPromise
        .then(function(tileset) {
          //调整高度
          var translation = Cesium.Cartesian3.fromArray([0, 0, 200])
          var m = Cesium.Matrix4.fromTranslation(translation) //fromTranslation()方法
          tileset.modelMatrix = m
          })
        .otherwise(function(error) {
          console.log(error)
        })
      

7.CZML,GEOJSON,KML设置贴地

czml和GEOJSON都是json格式,kml则接近与html标签的形式,这三种文件中都有clampToGround字段属性,加载时设置为true便可实现贴地

var dataSourcePromise = Cesium.CzmlDataSource.load('../Czml/MultipartVehicle_part1.czml',{clampToGround: true}) //CZML加载实体方式
      viewer.dataSources.add(dataSourcePromise)
      viewer.zoomTo(dataSourcePromise)

var dataSourcePromise = Cesium.GeoJsonDataSource.load('../JSON/1.json',{clampToGround: true})
      dataSourcePromise.then(function(dataSource) {
        viewer.dataSources.add(dataSource)
        viewer.flyTo(dataSource)
      })

var dataSourcePromise = Cesium.KmlDataSource.load('../Kml/facilities/facilities.kml', {clampToGround: true})
      dataSourcePromise.then(function(dataSource) {
        viewer.dataSources.add(dataSource)
        //viewer.flyTo(dataSource)
      })
  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 您好,在 Cesium设置 polygon 不地的方法如下: 1. 首先,使用 `Cesium.PolygonGeometry` 或 `Cesium.PolygonGeometry.fromPositions` 创建一个多边形几何体。 2. 然后,使用 `Cesium.PolygonGeometry.createGeometry` 或 `Cesium.PolygonGeometry.createShadowVolume` 创建一个多边形几何对象。 3. 接着,使用 `Cesium.MaterialAppearance` 创建一个材质外观对象,并将其传递给 `Cesium.Primitive` 的构造函数。 4. 最后,使用 `Cesium.Primitive.appearance` 属性设置多边形几何对象的外观,并使用 `Cesium.Primitive.vertexFormat` 属性设置多边形几何对象的顶点格式,例如,可以设置为 `Cesium.VertexFormat.POSITION_AND_NORMAL` 以指示多边形几何对象具有位置和法线数据。 示例代码如下: ``` // 创建多边形几何体 var polygon = new Cesium.PolygonGeometry({ polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([ -100.0, 30.0, -105.0, 30.0, -105.0, 35.0, -100.0, 35.0 ])), height: 0.0, extrudedHeight: 0.0, vertexFormat: Cesium.VertexFormat.POSITION_AND_NORMAL, stRotation: 0.0, ellipsoid: Cesium.Ellipsoid.WGS84 }); // 创建多边形几何对象 var geometry = Cesium.PolygonGeometry.createGeometry(polygon); // 创建材质外观对象 var material = new Cesium.Material({ fabric: { type: 'Color', uniforms: { ### 回答2: Cesium是一个开源的三维地理信息系统 (GIS) 库,可以通过JavaScript实现在网页上构建交互式的三维地球场景。在Cesium设置Polygon(多边形)时,默认情况下是地显示的,但也可以通过一些方法使其不地。 要使Polygon不地,可以通过在Polygon的顶点上设置高度偏移或将其放置于地球表面以下的位置。这样,Polygon将不再与地球表面紧密相连。使用Cesium的Entity API可以轻松实现这一点。 首先,我们需要创建一个Polygon实例,并设置其顶点集和其他属性。然后,我们可以通过在每个顶点上设置高度偏移来使Polygon不地。这可以通过设置每个坐标点的高度(Z轴上的值)来实现。例如,将高度设为负值,即可将Polygon放置在地球表面以下。 接下来,我们将创建一个Entity并将我们之前创建的Polygon实例指定为其polygon属性。然后,将Entity添加到Viewer中以在Cesium场景中显示。 示例代码如下: ``` // 创建一个Polygon实例 var polygon = new Cesium.PolygonGeometry({ positions : Cesium.Cartesian3.fromDegreesArrayHeights([ -120.0, 40.0, 1000.0, -110.0, 40.0, 1000.0, -110.0, 30.0, 1000.0, -120.0, 30.0, 1000.0 ]) }); // 创建一个Entity并设置其polygon属性为我们创建的Polygon实例 var entity = viewer.entities.add({ polygon : { hierarchy : new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray([ -120.0, 40.0, -110.0, 40.0, -110.0, 30.0, -120.0, 30.0 ])), extrudedHeight: -1000.0, material : Cesium.Color.RED.withAlpha(0.5) } }); ``` 以上示例代码中,我们使用了Cesium的Cartesian3对象来指定顶点的经纬度和高度。通过设置extrudedHeight属性为负值,我们将Polygon放置在地球表面以下。 通过这种方式,我们就可以在Cesium设置Polygon不地显示。 ### 回答3: 在Cesium中,如果要将polygon对象设置为不地,可以使用以下方法: 1. 使用Cesium中的地setProperty方法。例如,假设你有一个polygon对象叫做polygonEntity,你可以使用以下代码将其设置为不地:` polygonEntity.setProperty('heightReference', Cesium.HeightReference.NONE);` 这样,polygon对象将不会地,而是显示在固定高度位置。 2. 使用Cesium中的自定义shaders。对于一些高级需求,你可以使用Cesium的shaders功能来实现不地效果。你可以自定义一个shader,将polygon对象的顶点位置输出为固定高度的位置。具体实现需要对Cesium的shader编程有一定了解。 以上是在Cesium中将polygon对象设置为不地的两种方法。通过设置heightReference属性为HeightReference.NONE,或者自定义shaders,可以实现不地的效果。具体方法选择取决于你的需求和熟悉程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值