博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cesiumjs开发实践(五) 坐标变换
阅读量:6826 次
发布时间:2019-06-26

本文共 1987 字,大约阅读时间需要 6 分钟。

hot3.png

cesium中常用的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系。我们平时常用的以经纬度来指明一个地点就是用的WGS84坐标,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放等等。二者的联系如下图

124613_sr4k_1585572.png

笛卡尔空间坐标的原点就是椭球的中心。

      在实际应用中用的最多的操作就是(lng, lat, alt)<=>(x, y, z)之间的相互转换,cesiumjs为我们提供了这些转换

var ellipsoid = viewer.scene.globe.ellipsoid;var coord_wgs84 = Cesium.Cartographic.fromDegrees(lng, lat, alt);//单位:度,度,米var coord_xyz = ellipsoid.cartographicToCartesian(coord_wgs84);console.log('x=' + coord_xyz.x + ',y=' + coord_xyz.y + ',z=' + coord_xyz.z);//单位:米,米,米var xyz = new Cesium.Cartesian3(x, y, z);var wgs84 = ellipsoid.cartesianToCartographic(xyz);console.log('lng=' + Cesium.Math.toDegrees(wgs84.longitude) + ',lat=' + Cesium.Math.toDegrees(wgs84.latitude) + ',alt=' + wgs84.height);

需要注意cesium内部的角度单位是弧度,因此输入计算或输出显示时需要转换。

    转换到笛卡尔坐标系后就能运用计算机图形学中的仿射变换知识进行空间位置变换如平移旋转缩放。cesiumjs为我们提供了很有用的变换工具类,Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3x3矩阵,用于描述旋转变换)Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换),Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)。下面举个例子:

      一个局部坐标为p1(x,y,z)的点,将它的局部坐标原点放置到loc(lng,lat,alt)上,局部坐标的z轴垂直于地表,局部坐标的y轴指向正北,并围绕这个z轴旋转d度,求此时p1(x,y,z)变换成全局坐标笛卡尔坐p2(x1,y1,z1)是多少?

var rotate = Cesium.Math.toRadians(d);//转成弧度var quat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z, rotate); //quat为围绕这个z轴旋转d度的四元数var rot_mat3 = Cesium.Matrix3.fromQuaternion(quat);//rot_mat3为根据四元数求得的旋转矩阵var v = new Cesium.Cartesian3(x, y, z);//p1的局部坐标var m = Cesium.Matrix4.fromRotationTranslation(rot_mat3, Cesium.Cartesian3.ZERO);m2为旋转加平移的4x4变换矩阵,这里平移为(0,0,0),故填个Cesium.Cartesian3.ZEROm = Cesium.Matrix4.multiplyByTranslation(m, v);//m = m X vvar cart3 = ellipsoid.cartographicToCartesian(Cesium.Cartographic.fromDegrees(lng, lat, alt)); //得到局部坐标原点的全局坐标var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(cart3);//m1为局部坐标的z轴垂直于地表,局部坐标的y轴指向正北的4x4变换矩阵m = Cesium.Matrix4.multiplyTransformation(m, m1);//m = m X m1var p2 = Cesium.Matrix4.getTranslation(m);//根据最终变换矩阵m得到p2console.log('x=' + p2.x + ',y=' + p2.y + ',z=' + p2.z );

本篇到此结束,下一篇《cesiumjs开发实践(六) CZML》

转载于:https://my.oschina.net/u/1585572/blog/290548

你可能感兴趣的文章
spring 注解
查看>>
C#获取DLL、程序路径,C#获取桌面、收藏夹等特殊系统路径
查看>>
STL标准模板库 向量容器(vector)
查看>>
plt.spy()函数
查看>>
JAVA设计模式之观察者模式
查看>>
MacOS下免密码ssh登陆
查看>>
Could not find modernizr-2.6.2 in any of the sources
查看>>
使用二次封装的openStack发行版本网卡至少有2个
查看>>
js 的 call 与 apply
查看>>
Linux下安装jdk8步骤详述
查看>>
优化Http请求、规则1-减少Http请求 --更新中
查看>>
解决 - java.lang.OutOfMemoryError: unable to create new native thread
查看>>
<%@include file="a.jsp"%> jsp引用jsp文件时候注意
查看>>
转 intValue()的用法
查看>>
Docker学习笔记_Dockerfile基本知识
查看>>
css- 范围选择
查看>>
JavaScript深入【词法结构,类型,值和变量】原来也不简单
查看>>
3、Object对象的两大方法(hashCode-equals)总结
查看>>
matlab GUI之 -- 绘图
查看>>
'scope' is defined but never used
查看>>