cesium 指定点旋转rectangle Primitive方式 矩阵篇

cesium中rectangle是水平垂直于正北方向的,rectangle的属性中有rotation,但是rotation是以矩形的中心点进行旋转的,旋转过程中矩形的形状可能会变形,如果需要以矩形的顶点为原点进行旋转,可以采用primitive的方式添加polygon,并设置polygon的矩阵。

用entity的方式参考cesium 指定点旋转rectangle entity方式 坐标篇-CSDN博客

一、primitive的方式添加polygon

复制代码
 let p1 = [113.389, 38.094669];
        let p2 = [113.390968, 38.095338];


// 通过矩形的2个点,得到多边形的四个点
            let polygonInstance = new Cesium.GeometryInstance({
                geometry: Cesium.PolygonGeometry.fromPositions({
                    positions: Cesium.Cartesian3.fromDegreesArray([
                        ...p1,
                        p2[0], p1[1],
                        ...p2,
                        p1[0], p2[1]
                    ]),
                    height: 0,
                    vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
                }),
                attributes: {
                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('#00ff00').withAlpha(0.5))
                }
            });
            let polygonPrimitive = new Cesium.Primitive({
                geometryInstances: [polygonInstance],
                undisplayable: true,
                appearance: new Cesium.PerInstanceColorAppearance({
                    flat: true,
                    translucent: false
                })
            });

            viewer.scene.primitives.add(polygonPrimitive);

二、设置polygon的矩阵,以p1为原点顺时针旋转30度

复制代码
let center = Cesium.Cartesian3.fromDegrees(...p1);
            let localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(center);
            let worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4);

            let rotationZ = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(r));
            let rotationMatrix = Cesium.Matrix4.fromRotation(rotationZ);

            let localRotationMatrix = Cesium.Matrix4.multiply(rotationMatrix, worldToLocal_Matrix, new Cesium.Matrix4);
            let worldMatrix = Cesium.Matrix4.multiply(localToWorld_Matrix, localRotationMatrix, new Cesium.Matrix4);

            polygonPrimitive.modelMatrix = worldMatrix;

代码解析:Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(-30));

  1. cesium中z轴是向上的,所以面对着屏幕以p1为原点旋转需要调用用fromRotationZcesium mapboxgl+threebox glb 朝向问题 坐标轴方向_threebox z轴向上-CSDN博客
  2. fromRotationZ()指向正方向为逆时针方向,所以以p1为原点顺时针旋转30度的时候传入角度是-30

相关推荐
duansamve2 天前
Cesium中实现在地图上移动/旋转点、线、面
cesium
冥界摄政王3 天前
CesiumJS学习第四章 替换指定3D建筑模型
3d·vue·html·webgl·js·cesium
冥界摄政王5 天前
Cesium学习第二章 camera 相机
node.js·html·vue3·js·cesium
冥界摄政王6 天前
Cesium学习第一章 安装下载 基于vue3引入Cesium项目开发
vue·vue3·html5·webgl·cesium
你们瞎搞7 天前
Cesium加载20GB航测影像.tif
前端·cesium·gdal·地图切片
闲云一鹤9 天前
Cesium 使用 Turf 实现坐标点移动(偏移)
前端·gis·cesium
二狗哈9 天前
Cesium快速入门34:3dTile高级样式设置
前端·javascript·算法·3d·webgl·cesium·地图可视化
二狗哈10 天前
Cesium快速入门33:tile3d设置样式
3d·状态模式·webgl·cesium·地图可视化
闲云一鹤12 天前
Cesium 去掉默认瓦片和地形,解决网络不好时地图加载缓慢的问题
前端·cesium
闲云一鹤14 天前
将地图上的 poi 点位导出为 excel,并转换为 shp 文件
前端·cesium