Cesium坐標系統梳理(逐漸積累)


1.Cesium的笛卡爾三維坐標 new Cesium.Cartesian3(x,y,z)

2.經緯度坐標 new cesium.Cartographic(longitude,latitude,height)

經緯度除了特殊說明,一般都是弧度radians單位,也就是π。

弧度與角度的轉換方法:Cesium.Cartographic.toDegree();Cesium.Cartogrhpic.fromDegree(),同樣Cesium.Math.toDegree(radians)/toRadians(degree)

3.經緯度與cartesian3坐標之間

Cesium.Cartographic.fromCartesian(cartesian3,ellipsoid,resullt) 不同球體是不一樣的,這就是球體與投影

Cesium.Cartographic.fromDegrees(longitude,latitude,height,result) 這里是不需要球體的

Cesium.Cartographic.toCartesian(cartographic, ellipsoid, result)

4.矩陣

martix4,4*4的矩陣 矩陣轉換,將模型的X轉至真實空間的x

最常用的方法Cesium.Transfrom.eastNorthUpToFixedFrame() 以一個cartesian3點為中心,建成一個martix4矩陣,轉換。

其實質就是下面這個線性幾何公式

#Cesium.TranslationRotationScale(translation,rotation,scale)

three Parameters are:cartesian3,Quaternion,cartesian3

從字面上意思很明確:坐標轉換、旋轉、大小控制

#Cartesian3

Static members:

packedLength---將x,y,z放進array

UNIT_X/Y/Z---(1,0,0)/(0,1,0)/(0,0,1)

equals(right) → Boolean

Cesium中一些常用api

Cesium.Cartesian3.abs(cartesian, result) → Cartesian3

Cesium.Cartesian3.add(left, right, result) → Cartesian3

Cesium.Cartesian3.angleBetween(left, right) 返回兩個笛卡爾坐標之間的角度,left/right 均為一個cartesin3坐標,除非特殊說明單位都是弧度

Cesium.Cartesian3.cross(left, right, result) → Cartesian3 返回兩個向量的矢量積

Cesium.Cartesian3.distance(left, right) → Number 返回兩個坐標的距離

Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result) → Cartesian3

Cesium.Cartesian3.fromDegreesArray(coordinates, ellipsoid, result) → Array.<Cartesian3>

Cesium.Cartesian3.fromElements(x, y, z, result) → Cartesian3

Cesium.Cartesian3.multiplyByScalar(cartesian, scalar, result) → Cartesian3   乘以向量后的結果

Cesium.Cartesian3.negate(cartesian, result) → Cartesian3 方向取反

Cesium.Cartesian3.normalize(cartesian, result) —單位向量化

Cesium.Cartesian3.projectVector(a, b, result) → Cartesian3 投影

5.Cesium通過鼠標事件獲取坐標的方法

建立坐標獲取事件:var handler = new Cesium.ScreeSpaceEventHandler(canvas);

        handler.serInputAction(function(movement){獲取事件},Cesium.screeSpaceEventType.左鍵點擊/鼠標移動等)

&獲取屏幕坐標  movement.position  屏幕坐標的原點是屏幕左上角,方向x向左正,y向下正

&世界坐標(個人理解為 理論坐標 )

viewer.scene.pickEllipsoid(movement.position,ellipsoind,result)  點擊時候,相機的視角線與橢球體相交處的cartesian3坐標;

注意球體默認為wgs84,一般應設置為當前球體viewer.scene.globe.ellipsoid

獲取的即為視線與理論球體表面相交處的坐標,也可以理解為高程為0,因為真實的地表一般都是高程大於0,所以也就是物體的深部

&場景坐標(帶地形等緩沖的坐標)

viewer.scene.pickPosition(movement.position)  返回從深度緩沖區和窗口位置重建的笛卡爾位置,所以這里是沒有球體參數的

&地表(地形)坐標

var ray = viewer.camera.getPickRay(movement.position) 獲取camera與點擊點之間的視線射線

var position = viewer.scene.golbe.pick(ray,viewer.scene.) 獲取視線ray與golbe相交處的坐標

注意:這里是globe,則代表了主體為為ellipsoid加載地形高程后的,這樣才能區別理論坐標,所獲取數據為考慮高程后的空間直角坐標系

備注:globe翻譯過來是地球的意思,而ellipsoid為橢球體,在計算純球體理論的時候用的是后者,當加載地形之類實際實物后用的是前者

//獲取空間坐標
positon為movement.position/endposition視鼠標事件
type:1為理論坐標 3為緩沖坐標 4為地表坐標
_getPosition(position,type) { let viewer = this.viewer; let scene = viewer.scene; let cartesian = null; switch (type) { case 1://第一種 獲取理論坐標 這種方式的高程全為0 let cartesian = viewer.camera.pickEllipsoid(position,viewer.scene.globe.ellipsoid); return cartesian; break; case 3: let cartesian = scene.pickPosition(position); return cartesian; break; case 4 : let ray = scene.camera.getPickRay(position); let cartesian = scene.globe.pick(ray,viewer.scene); return cartesian; break; default: break; }

 6.cesium的三種拾取方式

  • Scene.pick : 返回窗口坐標對應的圖元的第一個對象。
  • Scene.drillPick :返回窗口坐標對應的所有對象列表。
  • Globe.pick : 返回一條射線和地形的相交位置點。

7.Matrix4   4x4矩陣

笛卡爾三維坐標 至 matrix4:  Cesium.Transform.eastNorthUpToFixedFrame(cartesian3)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM