cesium 入门到精通 (11-2) 多个实体创建一个primitive元素

接上上一节的 实体创建 primitive 元素的内容

我们在上一节 添加了一个 实体 如果我们 有多个实体加入到一个 prinitive 元素

其实这时候也很简单 就是 变成数组形式的就可以了

我直接粘贴代码了

<template>
  <div id="cesiumContainer" ref="cesiumContainer"></div>
</template>

<script setup>
// yarn add cesium
// 将cesium目录下的Build/Cesium4个目录拷贝到public,然后将widgets目录拷贝一份到src下
import * as Cesium from "cesium";
import "./Widgets/widgets.css";
import { onMounted } from "vue";

// 设置cesium token
Cesium.Ion.defaultAccessToken =
  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMzNkNTE5Zi1mMjY4LTRiN2QtOTRlZC1lOTUyM2NhNDYzNWYiLCJpZCI6NTU0OTYsImlhdCI6MTYyNTAyNjMyOX0.a2PEM4hQGpeuMfeB9-rPp6_Gkm6O-02Dm4apNbv_Dlk";

// 设置cesium静态资源路径
window.CESIUM_BASE_URL = "/";

// 设置cesium默认视角
Cesium.Camera.DEFAULT_VIEW_RECTANGLE = Cesium.Rectangle.fromDegrees(
  // 西边的经度
  89.5,
  // 南边维度
  20.4,
  // 东边经度
  110.4,
  // 北边维度
  61.2
);

onMounted(() => {
  var viewer = new Cesium.Viewer("cesiumContainer", {
    // 是否显示信息窗口
    infoBox: false,
    terrainProvider: Cesium.createWorldTerrain(),
  });

  // 隐藏logo
  viewer.cesiumWidget.creditContainer.style.display = "none";
  // 添加3D建筑
  const osmBuildings = viewer.scene.primitives.add(
    new Cesium.createOsmBuildings()
  );
  // 使用entity创建矩形
  var rectangle = viewer.entities.add({
    rectangle: {
      coordinates: Cesium.Rectangle.fromDegrees(
        // 西边的经度
        90,
        // 南边维度
        20,
        // 东边经度
        110,
        // 北边维度
        30
      ),
      material: Cesium.Color.RED.withAlpha(0.5),
    },
  });

  // primivite创建矩形
  // 01-创建几何体
  let rectGeometry = new Cesium.RectangleGeometry({
    rectangle: Cesium.Rectangle.fromDegrees(
      // 西边的经度
      115,
      // 南边维度
      20,
      // 东边经度
      135,
      // 北边维度
      30
    ),
    // 距离表面高度
    height: 0,
    vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
  });

  // 02-创建几何体实例
  let instance = new Cesium.GeometryInstance({
    geometry: rectGeometry,
    attributes: {
      color: Cesium.ColorGeometryInstanceAttribute.fromColor(
        Cesium.Color.RED.withAlpha(0.5)
      ),
    },
  });

  let rectGeometry1 = new Cesium.RectangleGeometry({
    rectangle: Cesium.Rectangle.fromDegrees(
      // 西边的经度
      140,
      // 南边维度
      20,
      // 东边经度
      160,
      // 北边维度
      30
    ),
    // 距离表面高度
    height: 0,
    vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
  });

  let instance2 = new Cesium.GeometryInstance({
    geometry: rectGeometry1,
    attributes: {
      color: Cesium.ColorGeometryInstanceAttribute.fromColor(
        Cesium.Color.BLUE.withAlpha(0.5)
      ),
    },
  });

  // 03-设置外观
  let appearance = new Cesium.PerInstanceColorAppearance({
    flat: true,
  });
  // 04-图元
  let primitive = new Cesium.Primitive({
    geometryInstances: [instance, instance2],
    appearance: appearance,
  });
  // 05-添加到viewer
  viewer.scene.primitives.add(primitive);

  viewer.camera.setView(viewer.entities);
});
</script>

<style>
* {
  margin: 0;
  padding: 0;
}
#cesiumContainer {
  width: 100vw;
  height: 100vh;
}
</style>

Cesium中,可以在Primitive的geometryInstances属性中添加多个GeometryInstance,实现多个几何体的渲染。每个GeometryInstance可以指定不同的几何体、材质、变换等属性。 以下是一个示例代码,演示了如何在一个Primitive中添加两个不同的BoxGeometry: ```javascript //创建场景和相机 var viewer = new Cesium.Viewer('cesiumContainer'); var scene = viewer.scene; var camera = viewer.camera; //创建两个BoxGeometry var box1 = new Cesium.BoxGeometry({ vertexFormat : Cesium.VertexFormat.POSITION_ONLY, minimum : new Cesium.Cartesian3(-250000.0, -250000.0, -250000.0), maximum : new Cesium.Cartesian3(250000.0, 250000.0, 250000.0) }); var box2 = new Cesium.BoxGeometry({ vertexFormat : Cesium.VertexFormat.POSITION_ONLY, minimum : new Cesium.Cartesian3(-1000000.0, -1000000.0, -1000000.0), maximum : new Cesium.Cartesian3(1000000.0, 1000000.0, 1000000.0) }); //创建两个GeometryInstance var instance1 = new Cesium.GeometryInstance({ geometry : box1, modelMatrix : Cesium.Matrix4.IDENTITY, attributes : { color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED) } }); var instance2 = new Cesium.GeometryInstance({ geometry : box2, modelMatrix : Cesium.Matrix4.IDENTITY, attributes : { color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE) } }); //创建Primitive并添加两个GeometryInstance var primitive = new Cesium.Primitive({ geometryInstances : [instance1, instance2], appearance : new Cesium.PerInstanceColorAppearance({ flat : true, translucent : false }) }); //将Primitive添加到场景中 scene.primitives.add(primitive); ``` 在上述代码中,我们先创建了两个BoxGeometry,然后分别创建了两个GeometryInstance,每个GeometryInstance指定了不同的BoxGeometry和颜色属性。最后,我们创建了一个Primitive,并将两个GeometryInstance添加到了它的geometryInstances属性中。在Primitive的appearance属性中,我们使用了PerInstanceColorAppearance,并指定了flat和translucent属性。最后将Primitive添加到场景中即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值