zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    单链表的相关操作
    R学习-- 数组和矩阵
    UIButton 设置圆角 边框颜色 点击回调方法
    【独立开发人员er Cocos2d-x实战 007】使用Cocos2dx UserDefault.xml
    聊一聊多源最短路径问题(仅仅有5行代码哦)
    Android cookies正确的更新方式
    Android IntentService的使用和源代码分析
    Android应用之——最新版本号SDK V2.4实现QQ第三方登录
    嵌套路由
    我自己用
  • 原文地址:https://www.cnblogs.com/xiaoguniang0204/p/11797632.html
Copyright © 2011-2022 走看看