Skip to content
Cesium计算模型包围盒各顶点数据

简介

本文将介绍如何使用Cesium计算模型的包围盒,并获取包围盒的各顶点数据。通过这些顶点数据,可以实现可视化包围盒或进行场景分析等任务。我们将详细解释实现的原理,并提供相应的代码示例。

思路

  • 使用 Cesium.Matrix3.multiplyByVector函数将包围盒的旋转和缩放变换应用于顶点坐标。这个变换由 halfAxes矩阵表示,它描述了包围盒的旋转和缩放信息。通过将顶点坐标与 halfAxes进行乘法运算,得到了变换后的顶点坐标。 这个步骤的目的是将包围盒的顶点坐标从包围盒局部坐标系转换到世界坐标系,使得它们能够正确显示在Cesium的场景中。乘法运算的结果是一个新的向量,表示顶点在世界坐标系中的位置。
  • 将变换后的顶点坐标与包围盒的中心坐标相加。由于包围盒的顶点坐标通常是相对于包围盒中心的偏移量,将其与中心坐标相加可以得到顶点在世界坐标系中的实际位置。
  • 使用 viewer.entities.add函数将计算得到的顶点位置作为一个实体添加到Cesium的场景中。每个顶点被表示为一个红色的点,具有指定的像素大小和颜色。

实现代码

javascript
function addBoundingSphereFun(center, halfAxes) {
        const BoxVertex = [
          new Cesium.Cartesian3(1, 1, 1),
          new Cesium.Cartesian3(1, -1, 1),
          new Cesium.Cartesian3(-1, -1, 1),
          new Cesium.Cartesian3(-1, 1, 1),
          new Cesium.Cartesian3(1, 1, -1),
          new Cesium.Cartesian3(1, -1, -1),
          new Cesium.Cartesian3(-1, -1, -1),
          new Cesium.Cartesian3(-1, 1, -1),
        ];
        BoxVertex.forEach((item) => {
          //相当于把起始点根据当前包围体的位置做了一次线性变换
          const transformPoint = Cesium.Matrix3.multiplyByVector(
            halfAxes,
            item,
            new Cesium.Cartesian3()
          );
          const newPoint = Cesium.Cartesian3.add(
            center,
            transformPoint,
            new Cesium.Cartesian3()
          );
          viewer.entities.add({
            position: newPoint,
            point: {
              pixelSize: 10,
              color: Cesium.Color.RED,
            },
          });
        });

实现效果 https://bu.dusays.com/2023/06/21/6492969c6bc31.png

Updated at: