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)

原文地址:https://www.cnblogs.com/xiaoguniang0204/p/11797632.html