标签:
OpenWebGlobe的相机主要在CameraNode和globenavigation这两个文件中,前者主要负责裁剪矩阵,project matrix,而后者主要是Model Matrix,虽然这两个脚本的代码不多,但要理解里面的矩阵计算,还得先从坐标系(Coordinate System)开始,通过坐标系,一步步的将我们的地理球(椭球体)转换成相机,程序可识别的虚拟地球。
学过地理信息系统的应该不难理解,但我并不是地信专业的,所以说的并不那么精确,虽然地球我们认为是球的,但从精度考虑,地球更类似于椭球体;另外,我们通常都是以经度和纬度来定位我们在地球上的某一个位置,而在计算机世界中,并不能理解经度和纬度的概念,需要我们转化为一个平面直角坐标系,即笛卡尔坐标系,才能够让计算机理解,这也是我们需要处理的第一步,有大地坐标系到平面直角坐标系之间的转换。
图1
首先转换的一端为大地坐标系,另一端是一个球(球的半径为6378137m),如上图所示,在大地坐标系下面,B代表纬度,L代表经度,H是距离地表的高度,需要转换为XYZ的平面直角坐标,单位为米,如下图,建立大地坐标系和平面直角坐标系的映射关系。
图2
推导过程就不在这里写了,网上相关的材料很多,这里只给出关键结果,方便大家的理解。
公式采用大地坐标系,其中e为离心率 0.006694379990197,N为地球半径,N=6378137米。
有了如上的公式,我们可以通过公式计算出任意一个(BLH)到(XYZ),完成了我们日常生活容易理解的经纬度到平时计算机容易理解的平面直角坐标系,也就是OpenGL能够识别的坐标系,但这还并不方便我们对相机的维护,举个例子,平时在日常生活中,我们从北京飞到纽约,我们是以球心作为参考系,位置不变,而我们做飞机围绕球心进行旋转从而到达目的地,这个是现实中的实现方式,但是假如我们是在浏览地球仪,想要从北京飞到纽约,你会绕着地球仪从北京移动到纽约吗,很少有人会自己绕着地球仪(地球仪静止)从北京看到纽约吧?多数人应该坐在椅子上,用手渲染地球仪,从北京看到纽约。因此两者之前还有区别,一个是以地球球心,一个是以相机为中心点,而作为一个地球软件,我们更倾向于以相机为中心点浏览地球仪,而不是真的要在地球上移动。
所以,我的意思是,从大地坐标系转到平面坐标系,解决了真实的地理坐标和计算机识别的坐标,但在计算机和观察者直接的隔阂还是需要进行转换的,即如何将以球心和以相机为中心的坐标之间的转换,从而方便我们的浏览,于是乎,需要另外一个引入另外一个坐标
在OpenWebGlobe中采用的是NED的本地坐标系,即North、East、Down,如下图
图3
此时,代表x轴是North,y轴为East,Z轴向下的坐标系,如果我们从北京的经纬度,旋转到纽约所在的经纬度,而相机视角不变,则需要地球仪进行旋转,假如旋转了(B,L),则相对相机坐标的旋转角度,R(x) = 90-L, R(z)=90+B,根据x轴和z轴的旋转矩阵,然后相乘可以得到坐标系的转换矩阵如下:
这样,我们实现了从平面直角坐标系到相机为中心的坐标转换的一个过程,这样以相机作为参考系,方便今后相机的相关操作,而在着色器中需要获取以地球为中心的相机位置,这时矩阵求逆就可以得到,原理很简单,这里不再赘述,推荐一个帖子:http://blog.csdn.net/popy007/article/details/5120158
至此,我们的坐标转换工作基本完成,但在平时浏览中,我们有时想将地球倾斜,即绕xyz轴旋转任意角度这样的一个操作,类似飞行模拟的体验,这样还涉及一个非常简单的坐标系
这个比较简单,无非是观察者在摇头晃脑,而所有的旋转都可以进行分解xyz的旋转,如下图,
这样,本身就是xyz三个轴的旋转矩阵,这里就不给出旋转矩阵的公式了。
至此我们了解了地球坐标的一个过程,即地理坐标转为计算机识别的直角坐标,同时便于以后的操作,需要转换为相机为中心点的local坐标系,这样相机的平移缩放,都转为地球对应的逆操作,我向看地球仪近一点,比如前进5m,其实是地球仪朝你前进了5m,类似的操作,同时我可能想从切面的角度看地球或其他的角度俯瞰仰看,就需要我自身的一个旋转。这样,实现地球构建的所有三个坐标系在这里都和大家讲述了一下基本的原理和对应的公式,下一节,讲OpenWebGlobe的相机时,会用到这些相关的知识,也算为后面的内容做一个理论铺垫。ok,下一节:OpenWebGlobe.Camera~
标签:
原文地址:http://www.cnblogs.com/luguowei/p/4713143.html