【第六章 WebGIS】Cesium中3dtiles的平移旋转和坐标转换

Cesium.Cartesian3(相当于Point3D)

Cesium.Matrix3(3x3矩阵,用于描述旋转变换)

Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换)

// 创建一个3X3 的旋转矩阵
let m3 = new Cesium.Matrix3(
1,0,0,
0,1,0,
0,0,1
)
// 通过一个旋转角度创建一个3X3的旋转矩阵
let m3 = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(60));

// 创建一个4X4 旋转平移变换矩阵
let m4 = new Cesium.Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
)

// 通过一个平移向量Cartesian3,创建一个4X4矩阵
let translation =  new Cesium.Cartesian3( 20, 15, 0 );
let m4 = Cesium.Matrix4.fromTranslation(translation);

// 通过一个3X3的旋转矩阵创建一个4x4的矩阵
let rotationZ = Cesium.Matrix4.fromRotationTranslation(m3);

//根据不同方向的缩放比例生成缩放矩阵
const m = Cesium.Matrix4.fromScale(new Cesium.Cartesian3(7.0, 8.0, 9.0));

//相同的缩放比例生成缩放矩阵
const m = Cesium.Matrix4.fromUniformScale(2.0);

//计算当参考系是局部坐标时,此位置为原点的局部坐标系,到世界坐标的转换矩阵(eastNorthUpToFixedFrame)
let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);

关键属性:

tileset._root.transform: The local transform of this tile.

tileset.modelMatrix: A 4x4 transformation matrix that transforms the entire tileset.

  var params = {
    tx: 114,  //模型中心X轴坐标(经度,单位:十进制度)
    ty: 22,     //模型中心Y轴坐标(纬度,单位:十进制度)
    tz: 0,    //模型中心Z轴坐标(高程,单位:米)
    rx: 60,     //X轴(经度)方向旋转角度(单位:度)
    ry: 30,     //Y轴(纬度)方向旋转角度(单位:度)
    rz: 0,       //Z轴(高程)方向旋转角度(单位:度)
    scale: 1   //缩放比例
};
  
  function update3dtilesMaxtrix(params) {
            //旋转

            let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
            let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
            let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
            //旋转矩阵Matrix3
            let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
            let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
            let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
            //平移旋转矩阵Matrix4
            let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
            let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);

            let scale = Cesium.Matrix4.fromUniformScale(0.85);
            // //缩放
            Cesium.Matrix4.multiply(m, scale, m);
            //旋转、平移矩阵相乘
            Cesium.Matrix4.multiply(m, rotationX, m);
            Cesium.Matrix4.multiply(m, rotationY, m);
            Cesium.Matrix4.multiply(m, rotationZ, m);
            //赋值给tileset
            return m;
}
this.tileset._root.transform = m;

【1】根据模型局部坐标偏移量进行平移

引自互联网

  • 获取当前瓦片数据集的包裹范围(boundingSphere)中心(此时参考系是世界坐标)
  • 计算当参考系是局部坐标时,此位置为原点的局部坐标系,到世界坐标的转换矩阵(eastNorthUpToFixedFrame)
  • 利用上一步的转换矩阵,左乘一个局部平移向量,得到此平移向量在世界坐标系下的平移目标位置(矩阵×向量,结果是向量)
  • 向量相减:世界坐标系下,指向平移目标点位的目标向量 - 指向模型中心的向量,得到世界坐标系下的平移向量
  • 将世界坐标系下的平移向量转换成平移矩阵,赋予 tileset.modelMatrix
this.tileset.readyPromise.then(currentModel => {
   const cartographic = Cesium.Cartographic.fromCartesian(this.tileset.boundingSphere.center);
   //初始向量
   const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
   //计算当前位置对应的Matrix4
   const m = Cesium.Transforms.eastNorthUpToFixedFrame(surface);
   //计算偏移矩阵
   const _tx = 0;
   const _ty = 0;
   const _tz = 70;
   const tempTranslation = new Cesium.Cartesian3(_tx, _ty, _tz);
   //新位置向量
   const offset = Cesium.Matrix4.multiplyByPoint(m, tempTranslation, new Cesium.Cartesian3(0,0,0));
   //得到平移向量
   const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
   //根据平移向量生成平移矩阵
   this.tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});

注意:模型的原点不一定是boundingSphere.center,所以初始的this.tileset._root.transform与m = Cesium.Transforms.eastNorthUpToFixedFrame(surface) 不一样。

【2】根据偏移量进行坐标转换

    function translate(origin, translateCartesian) {
        let newPos = Cesium.clone(origin);
        let transform = Cesium.Transforms.eastNorthUpToFixedFrame(origin); //东-北-上参考系构造出4*4的矩阵
        /*构造平移变换矩阵获取坐标
        let m = new Cesium.Matrix4();
        Cesium.Matrix4.setTranslation(Cesium.Matrix4.IDENTITY, translateCartesian, m); //构造平移矩阵
        let modelMatrix = Cesium.Matrix4.multiply(transform, m, transform); //平移矩阵左乘当前位置矩阵
        Cesium.Matrix4.getTranslation(modelMatrix, newPos); //从位置矩阵中取出坐标信息
        return newPos;
        */
        /*平移向量变换生成新的向量
        const newPos = Cesium.Matrix4.multiplyByPoint(transform, translateCartesian, new Cesium.Cartesian3(0,0,0));
        return newPos;
        /
    }

    const originPoint = Cesium.Cartesian3.fromDegrees(this.position.center[0],this.position.center[1], 0);
    let newPoint = translate(originPoint, new Cesium.Cartesian3(x,y,z));
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGIS加载大型的3D Tiles倾斜摄影数据可以按照以下步骤进行: 1. 数据准备:首先,确保你已经准备好了大型的3D Tiles倾斜摄影数据。这些数据通常包括了大量的倾斜摄影图像以及相关的地理信息数据,如摄影位置、姿态、纹理等。 2. 数据处理:将倾斜摄影数据转换为3D Tiles格式。你可以使用一些专业的软件或库来处理,例如CesiumJS、Potree等。这些工具可以帮助你将倾斜摄影数据转换为符合3D Tiles规范的格式,并生成相应的索引文件。 3. 数据存储:将处理后的3D Tiles数据上传到Web服务器或云存储平台。确保你的服务器具备足够的存储空间和带宽来支持大型数据集的加载和传输。 4. WebGIS应用开发:使用WebGIS开发框架,如CesiumJS、Mapbox等,创建一个WebGIS应用。在应用,你可以使用相应的API或库来加载和显示3D Tiles数据。 5. 数据加载:在WebGIS应用,使用相应的API或库加载你的3D Tiles数据集。根据你的需求,你可以选择加载整个数据集或者按需加载特定区域的数据。 6. 数据优化:对于大型的3D Tiles数据集,你可能需要进行一些数据优化操作以提高加载性能。例如,通过使用层次化的LOD(Level of Detail)技术,只加载当前视野范围内的数据,或者使用空间索引来加速数据查询和渲染。 7. 用户交互:在WebGIS应用,你可以为用户提供一些交互功能,例如平移、缩放、旋转等操作,以便他们能够浏览和探索3D Tiles倾斜摄影数据集。 请注意,加载大型的3D Tiles倾斜摄影数据需要考虑到网络传输、数据处理和性能优化等方面的问题。确保你的系统具备足够的硬件资源和网络环境来支持这些需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值