Cesium学习笔记(11)

114 阅读2分钟

Primitive

Primitive的使用

//创建长方形几何体  
const Rectangle=new Cesium.RectangleGeometry({
   //矩形所在的椭球体
  ellipsoid:Cesium.Ellipsoid.default,
  rectangle:Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
  //距离地球表面高度
  height:100000, 
 //挤出高度
  // extrudedHeight:100000,  
 // 顶点属性(???????)      
 vertexFormat:Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,

})
//创建几何体实例   (实例化 几何体实例类  上面创建的长方形几何体作为配置参数传入这个几何实例类)
let instance=new Cesium.GeometryInstance({
  geometry:Rectangle,
  attributes:{
    color:Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED.withAlpha(0.5))
  }
});

let appearance=new Cesium.PerInstanceColorAppearance({
  //设置是否使用3d模式绘制
  flat:true,
})
//将几何体实例添加进一个Primitive中
let primitive=new Cesium.Primitive({
  geometryInstances:instance,
  //几何体的外观
  appearance:appearance,
})
//将这个承载着长方形几何体的Primitive添加进Cesium场景中
//经过上面一系列步骤就能在Cesium中看见这个长方形了
viewer.scene.primitives.add(primitive);


//使用entity创建矩形  就非常简单了
let rectangle=viewer.entities.add({
  rectangle:{
    coordinates:Cesium.Rectangle.fromDegrees(
      -90.0,
      39.0,
      -85,
      42.0
    ),
    height:10000,
    material:Cesium.Color.BLACK.withAlpha(0.5),
  },
})

使用primitive创建矩形和使用entity有很大的不同,primitive更复杂,也更灵活。

动态修改Primitive的颜色

//先创建两个长方形几何体
const Rectangle=new Cesium.RectangleGeometry({
  ellipsoid:Cesium.Ellipsoid.default,
  rectangle:Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
  //距离地球表面高度
  height:100000,
  vertexFormat:Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,

})
const Rectangle2=new Cesium.RectangleGeometry({
  ellipsoid:Cesium.Ellipsoid.default,
  rectangle:Cesium.Rectangle.fromDegrees(-70.0, 39.0, -65.0, 42.0),
  //距离地球表面高度
  height:100000,
  vertexFormat:Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,

})
//创建几何体实例   (实例化 类)
let instance=new Cesium.GeometryInstance({
   //给几何体实例一个id  唯一标识符
  id:"instance1",
  geometry:Rectangle,
  attributes:{
    color:Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED.withAlpha(0.5))
  }
});

let instance2=new Cesium.GeometryInstance({
  id:"instance2",
  geometry:Rectangle2,
  attributes:{
    color:Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE.withAlpha(0.5))
  }
});
let appearance=new   Cesium.PerInstanceColorAppearance({
  //设置是否使用3d模式绘制
  flat:true,
})

//将几何体实例放入Primitive中
let primitive=new Cesium.Primitive({
  geometryInstances:[instance,instance2],
  appearance:appearance,
})
viewer.scene.primitives.add(primitive);
viewer.zoomTo(viewer.entities);

//设置一个setTimeout函数 动态改变第一个几何体的颜色

setTimeout(()=>{
  //获取primitive的对应几何实例属性类
  let att=primitive.getGeometryInstanceAttributes("instance1");
  //修改颜色
  att.color=Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.YELLOW.withAlpha(0.8));
},2000)

//设置一个setInterval函数 随机改变第二个几何体的颜色
setInterval(()=>{
  let att=primitive.getGeometryInstanceAttributes("instance2");
  //随机颜色
  att.color=Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.fromRandom({alpha:0.5}));
},2000)

image.png

image.png

点击修改Entity和Primitive颜色

  //屏幕事件处理器
  let hander = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  //给处理器设置一个 左键监听事件
  hander.setInputAction((e) => {
    // 回调参数e是一个对象 立面包含着点击位置对应的笛卡尔二维坐标  也就是屏幕坐标
    //通过屏幕坐标获取到对应的对象
    let pickedObject = viewer.scene.pick(e.position);
    let pickedObjectatt = pickedObject.primitive.getGeometryInstanceAttributes(pickedObject.id);
    //修改颜色(给一个随机颜色)
    pickedObjectatt.color = Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.fromRandom({ alpha: 0.5 }));

  }, Cesium.ScreenSpaceEventType.LEFT_CLICK)

image.png

点击第一个矩形(由Entity创建) 颜色改变(第三个颜色改变是因为前面的时间间隔函数)

image.png

点击第二个矩形 颜色改变

image.png

点击第三个颜色 颜色改变

image.png

打印pickedObject

点击由Entity创建的矩形

image.png 点击由Primitive创建的矩形

image.png

可以看到,primitive属性名对应的类是Primitive。其实,Entity是高度封装的Primitive,所以可以使用getGeometryInstanceAttributes方法来修改第一个矩形的颜色

发现

当Entity创建的矩形不设置height属性时,打印的pickedObject中的primitive属性是GroundPrimitive

image.png