球是x,y,z轴的长度都相等;
椭球是x,y,z不一定相等。
如果椭球是两长一短,且两长相同,则为扁球体。短/长越小,则越扁。
月球可以认为是球体,火卫一奇形怪状。
地球wgs84椭球体属于扁球体。长半轴是赤道,短半轴是极点半径。
程序中处理地球形状的方法最好是采用椭球体基类,同时采用用户自定义半径。这样适应各种椭球体。
这个_oneOverRadiiSquared是用来计算大地表面法线的。具体方法如下:
在glsl上也可以计算大地表面法线
那什么是大地表面法线?
地球有两个法线,一个是地心法线,一个是大地表面法线。。
地心法线是地心到地面一点的向量;大地表面法线是该点与椭球体相切平面的法线。
可以认为是全局法线和局部法线的关系
一般,用大地表面法线,因为这是真实法线,计算经纬高所用。高度是对于局部来说的,抬头看看这个小鸟距离我有多高。
如果我站在一个大圆球上,一脚向下垂直踩下去,可以沿着地心法线,也是沿着大地表面法线。
然而,目前是踩在一个大鸭蛋上,一脚踩下去,将会沿着大地表面法线踩下去;而踩不到地心上,也就不在地心法线上。
所以,很明显,椭球体越扁,大地表面法线越偏离地心法线。
那么,计算高度时,为啥要用大地表面法线,而不是地心法线呢?
因为对于较高的物体,比如太空设备,沿着地心法线测量会产生较大误差。这个误差与地心法线和大地法线之间的角差别相关,角差别越大,误差越大;
那这个角差别是哪两个角的差别呢?
是纬度差别;也就是大地纬度和地心纬度的差别。
地心纬度和大地纬度如何计算呢?
地心纬度是指赤道平面和指定点地心法线的夹角。
大地纬度(地理纬度)是指赤道平面(例如,wgs84坐标系中xy平面)与该点大地表面法线的夹角。
而大地法线和地心法线之间角差别大约在纬度45度左右。
调试下,看看扁率对大地法线和地心法线偏离的影响。
球体时,两者重合
短轴减小时,
调试下
各种状态跳过,后续章节学习时再深入。
shader这一块后面再看
接下来是正式绘制
其它暂时不涉及到的,不进行跟踪了。