在場(chǎng)景中移動(dòng)或旋轉(zhuǎn)entity,3dtiles。都可以通過(guò)4*4的矩陣來(lái)實(shí)現(xiàn)。我封裝了一個(gè)通用的轉(zhuǎn)換位置工具類,可直接用于平移,旋轉(zhuǎn)entity和3dtiles等情況 代碼下載
一,平移?
1.平移entity,先計(jì)算出entity的4*4位置矩陣,然后再乘以平移矩陣,然后更新entity的位置
? ? ? ? ? ?let?position?=?object.position.getValue(Cesium.JulianDate.now());//求出當(dāng)前事件entity的位置
? ? ? ? ? ?let transform?=?Cesium.Transforms.eastNorthUpToFixedFrame(position);//東-北-上參考系構(gòu)造出4*4的矩陣
? ? ? ? ? ?let m=new Cesium.Matrix4();
? ? ? ? ? ?Cesium.Matrix4.setTranslation(Cesium.Matrix4.IDENTITY,new Cesium.Cartesian3(10,10,10),m)//構(gòu)造平移矩陣
????????????let?modelMatrix?=?Cesium.Matrix4.multiply(transform,?m,?transform);//將當(dāng)前位置矩陣乘以平移矩陣得到平移之后的位置矩陣
????????????Cesium.Matrix4.getTranslation(modelMatrix,?position);//從位置矩陣中取出坐標(biāo)信息
????????????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)//構(gòu)造平移矩陣
? ? ? ? ? ?object.root.transform?=?Cesium.Matrix4.multiply(transform,?m,?transform);//計(jì)算平移之后的位置矩陣,然后更新3dtiles的位置
二,旋轉(zhuǎn)?
1.旋轉(zhuǎn)entity,先計(jì)算出entity的4*4位置矩陣,然后再乘以旋轉(zhuǎn)矩陣,然后更新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);//根據(jù)沿著x,y,z軸旋轉(zhuǎn)之后,得到旋轉(zhuǎn)矩陣
?let?orientation?=?new?Cesium.Quaternion();
?let?m3?=?Cesium.Matrix4.getRotation(transform,?new?Cesium.Matrix3());//得到3*3的旋轉(zhuǎn)矩陣
?Cesium.Quaternion.fromRotationMatrix(m3,?orientation);//將旋轉(zhuǎn)矩陣轉(zhuǎn)換成齊次坐標(biāo)
? object.orientation.setValue(orientation);//更新entity的朝向
2.旋轉(zhuǎn)3dtiles,先計(jì)算出3dtiles的4*4位置矩陣,然后再乘以旋轉(zhuǎn)矩陣,然后更新3dtiles的位置
let transform?=?object._root.transform;//從3dtile對(duì)象得到位置矩陣
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);//根據(jù)沿著x,y,z軸旋轉(zhuǎn)之后,得到旋轉(zhuǎn)矩陣
?object._root.transform?=?transform;//更新3dtiles的位置矩陣