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

相关推荐
总要学点什么1 天前
第79篇:数据可视化-模拟迁徙效果——把三十条航线画成会飞的弧
3d·信息可视化·数据挖掘·数据分析·gis·webgl·cesium
总要学点什么4 天前
第75篇:右键菜单控件——把一张会做事的菜单钉在鼠标落下的那点
前端·信息可视化·echarts·cesium·空间分析
迷迭绿6 天前
Cesium 轨迹回放播放器
前端·javascript·cesium
总要学点什么9 天前
第65篇:地图卷帘控件——点「关闭卷帘」,消失的却是右边那半张地图
信息可视化·gis·webgl·cesium·空间分析
总要学点什么14 天前
第55篇:空间分析-剖面分析——红线走大圆,剖面却按经纬直线采样
前端框架·gis·webgl·cesium·空间分析
总要学点什么15 天前
第51篇:数据分析-热力图——笔刷画的是圆,落到地上却成了椭圆
3d·数据挖掘·数据分析·前端框架·gis·webgl·cesium
总要学点什么18 天前
第47篇:三维特效-雷达波效果——波纹一圈圈往外推,一半却埋在地下
3d·前端框架·gis·webgl·cesium
夜郎king25 天前
基于 Cesium + 天地图的三维地理可视化:以“岳麓山名人墓“为例,详解地形夸张、自动环绕与标签碰撞避让
cesium·实景三维·人文历史
前端小崔1 个月前
Three.js 与 Cesium 融合实战问题汇总
前端·three.js·cesium
洛兮银儿1 个月前
前端页面引入cesium
前端·cesium