cesium使用矩陣實(shí)現(xiàn)平移,旋轉(zhuǎn)entity,3dtiles(工具篇)

在場(chǎng)景中移動(dòng)或旋轉(zhuǎn)entity,3dtiles。都可以通過(guò)4*4的矩陣來(lái)實(shí)現(xiàn)。我封裝了一個(gè)通用的轉(zhuǎn)換位置工具類,可直接用于平移,旋轉(zhuǎn)entity和3dtiles等情況 代碼下載

旋轉(zhuǎn)模型?平移模型

一,平移?

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的位置矩陣


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容