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

在场景中移动或旋转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的位置矩阵


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容