美文网首页
cesium使用矩阵实现平移,旋转entity,3dtiles(

cesium使用矩阵实现平移,旋转entity,3dtiles(

作者: panergongzi | 来源:发表于2021-02-21 16:46 被阅读0次

    在场景中移动或旋转entity,3dtiles。都可以通过4*4的矩阵来实现。我封装了一个通用的转换位置工具类,可直接用于平移,旋转entity和3dtiles等情况 代码下载

    旋转模型 平移模型

    一,平移 

    1.平移entity,先计算出entity的4*4位置矩阵,然后再乘以平移矩阵,然后更新entity的位置

               let position = object.position.getValue(Cesium.JulianDate.now());//求出当前事件entity的位置

               let transform = Cesium.Transforms.eastNorthUpToFixedFrame(position);//东-北-上参考系构造出4*4的矩阵

               let m=new Cesium.Matrix4();

               Cesium.Matrix4.setTranslation(Cesium.Matrix4.IDENTITY,new Cesium.Cartesian3(10,10,10),m)//构造平移矩阵

                let modelMatrix = Cesium.Matrix4.multiply(transform, m, transform);//将当前位置矩阵乘以平移矩阵得到平移之后的位置矩阵

                Cesium.Matrix4.getTranslation(modelMatrix, position);//从位置矩阵中取出坐标信息

                object.position.setValue(position);//更新enity的位置

    2,平移3dtiles,取出3dtiles的位置矩阵,然后再乘以平移矩阵,然后更新3dtiles的位置

               let transform = object._root.transform;//从3dtile得到位置矩阵

               let m=new Cesium.Matrix4();

              Cesium.Matrix4.setTranslation(Cesium.Matrix4.IDENTITY,new Cesium.Cartesian3(10,10,10),m)//构造平移矩阵

               object.root.transform = Cesium.Matrix4.multiply(transform, m, transform);//计算平移之后的位置矩阵,然后更新3dtiles的位置

    二,旋转 

    1.旋转entity,先计算出entity的4*4位置矩阵,然后再乘以旋转矩阵,然后更新entity的位置

    let position = object.position.getValue(Cesium.JulianDate.now());//先得到entity的位置

    let orientation = object.orientation.getValue(Cesium.JulianDate.now());//entity的朝向

    function rotatingByMatrix4(mat, options) {

    let _rotateX = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(options.x));

    let _rotateY = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(options.y));

    let _rotateZ = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(options.z));

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateX, mat);

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateY, mat);

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateZ, mat);       

     return mat;

    }

     let transform = Cesium.Matrix4.fromTranslationQuaternionRotationScale(position, orientation, new Cesium.Cartesian3(1, 1, 1), new Cesium.Matrix4());//得到entity的位置朝向矩阵

     transform = rotatingByMatrix4(transform, options);//根据沿着x,y,z轴旋转之后,得到旋转矩阵

     let orientation = new Cesium.Quaternion();

     let m3 = Cesium.Matrix4.getRotation(transform, new Cesium.Matrix3());//得到3*3的旋转矩阵

     Cesium.Quaternion.fromRotationMatrix(m3, orientation);//将旋转矩阵转换成齐次坐标

      object.orientation.setValue(orientation);//更新entity的朝向

    2.旋转3dtiles,先计算出3dtiles的4*4位置矩阵,然后再乘以旋转矩阵,然后更新3dtiles的位置

    let transform = object._root.transform;//从3dtile对象得到位置矩阵

    function rotatingByMatrix4(mat, options) {

    let _rotateX = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(options.x));

    let _rotateY = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(options.y));

    let _rotateZ = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(options.z));

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateX, mat);

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateY, mat);

    mat = Cesium.Matrix4.multiplyByMatrix3(mat, _rotateZ, mat);

     return mat;

    }

    transform = rotatingByMatrix4(transform, options);//根据沿着x,y,z轴旋转之后,得到旋转矩阵

     object._root.transform = transform;//更新3dtiles的位置矩阵

    相关文章

      网友评论

          本文标题:cesium使用矩阵实现平移,旋转entity,3dtiles(

          本文链接:https://www.haomeiwen.com/subject/uzbxfltx.html