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