cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵

cesium调整3dtiles的位置用到的是平移矩阵,原理是在世界坐标系中用偏移点减去原始点得到一个平移向量,再根据这个向量得到平移矩阵。

  • 原始点:一般是模型的中心点位置,可通过模型的包围盒得到
  • 偏移点:可分为两种情况,
  1. 直接给出世界坐标系中的一个位置,这两个点在世界坐标系中没有相对关系
  2. 给出模型的相对位置,比如说让模型沿x轴正方向偏10米,此时这个偏移点和模型就有相对关系,但是偏移点在世界坐标系中并没有描述,因此需要根据模型建立一个局部坐标系,将局部坐标系变换到世界坐标,求出偏移点在世界坐标系中的值。注意:到这一步情况就和1相同了,后面的转换也和1相同。

一、加载 3dtiles

 tileset = new Cesium.Cesium3DTileset({
                url: '/data/tileset.json',
                maximumScreenSpaceError: 2,  //最大的屏幕空间误差
                maximumNumberOfLoadedTiles: 1000, //最大加载瓦片个数
                dynamicScreenSpaceError: true,
                dynamicScreenSpaceErrorDensity: 0.00278,
                dynamicScreenSpaceErrorFactor: 4.0,
                dynamicScreenSpaceErrorHeightFalloff: 0.25,
                skipLevelOfDetail: true,
                baseScreenSpaceError: 1024,
                skipScreenSpaceErrorFactor: 16,
                skipLevels: 1,
                immediatelyLoadDesiredLevelOfDetail: false,
                loadSiblings: false,
                cullWithChildrenBounds: true,
            });
            viewer.scene.primitives.add(tileset);

二、世界坐标系中的平移

tileset.readyPromise.then(function () {
                // 模型外包围盒,center:模型中心点,radius:包围盒半径
                let boundingSphere = tileset.boundingSphere;
                // 模型中心点
                let origin = boundingSphere.center;

                // 偏移后的位置,世界坐标系中的位置,比如从经纬度1的位置偏移到经纬度2的位置,并不知道1和2的相对关系
                let offset = Cesium.Cartesian3.fromDegrees(
                    113.296969, 38.390417, 39.974122
                );

                // 计算世界坐标系下平移向量
                let translate = Cesium.Cartesian3.subtract(
                    offset,
                    origin,
                    new Cesium.Cartesian3()
                );
                tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);
            });

三、相对位置的平移

tileset.readyPromise.then(function () {
                // 模型外包围盒,center:模型中心点,radius:包围盒半径
                let boundingSphere = tileset.boundingSphere;
                // 模型中心点
                let origin = boundingSphere.center;

                // 获取到以模型中心为原点,Z轴垂直地表的局部坐标系,以矩阵表示,此矩阵为将局部坐标系变换到世界坐标系的变换矩阵
                let localMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
                // 平移向量(tx,ty,tz) 此处表示沿着x轴平移10米,y轴和z轴不变
                let tempTranslation = new Cesium.Cartesian3(10, 0, 0);
                
                // 偏移后的位置,世界坐标系中的位置,即:局部坐标中(tx,ty,tz)在世界坐标系中位置
                let offset = Cesium.Matrix4.multiplyByPoint(localMatrix, tempTranslation, new Cesium.Cartesian3(0, 0, 0));

                // 计算世界坐标系下平移向量
                let translate = Cesium.Cartesian3.subtract(
                    offset,
                    origin,
                    new Cesium.Cartesian3()
                );
                tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);
            });

总结:两种情况的平移原理是一样的,都是在世界坐标系中 偏移点-原始点 得到平移向量,只是相对位置的平移多了局部坐标系到世界坐标系转换的过程。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 07:18:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 07:18:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 07:18:06       82 阅读
  4. Python语言-面向对象

    2024-04-12 07:18:06       91 阅读

热门阅读

  1. 自动驾驶感知场景挖掘

    2024-04-12 07:18:06       37 阅读
  2. LiveData和ViewModel源码学习

    2024-04-12 07:18:06       33 阅读
  3. * ./cptable in ./node_modules/xlsx-style/dist/cpexcel.js

    2024-04-12 07:18:06       32 阅读
  4. Android中的drawable

    2024-04-12 07:18:06       28 阅读
  5. DA转换(数模转换)

    2024-04-12 07:18:06       36 阅读
  6. 18. 【Android教程】图片控件 ImageView

    2024-04-12 07:18:06       34 阅读
  7. Redis部署之哨兵

    2024-04-12 07:18:06       41 阅读
  8. 三维情况下的UWB定位原理和matlab原创函数源码

    2024-04-12 07:18:06       35 阅读
  9. Spring Boot中@KafkaListener使用${}动态指定topic

    2024-04-12 07:18:06       166 阅读