Shader之ECEF——LLH

uniform mat4 osg_ViewMatrix;
uniform mat4 osg_ViewMatrixInverse;
uniform mat4 osg_ModeViewMatrix;
uniform mat4 osg_ProjectionMatrix;
uniform float osg_SimulationTime;
uniform sampler2D ocean_data;
const float radiusEquator = 6378137.0;
const float radiusPolar = 6356752.3142;
vec3 ECEF_TO_LLH(in vec3 xyz)
{
    float p = sqrt(xyz.x * xyz.x + xyz.y * xyz.y);
    float theta = atan(xyz.z * radiusEquator,(p * radiusPolar));
    float eDashSquared = (radiusEquator * radiusEquator - radiusPolar * radiusPolar)/(radiusPolar * radiusPolar);
    float sin_theta = sin(theta);
    float cos_theta = cos(theta);

    float flattening = (radiusEquator - radiusPolar)/radiusEquator;
    float eccentricitySquared = 2 * flattening - flattening * flattening;    
    float latitude = atan((xyz.z + eDashSquared * radiusPolar * sin_theta * sin_theta * sin_theta)/(p - eccentricitySquared * radiusEquator * cos_theta * cos_theta * cos_theta));
    float longitude = atan(xyz.y,xyz.x);
    float sin_latitude = sin(latitude);
    float N = radiusEquator /sqrt(1.0 - eccentricitySquared * sin_latitude * sin_latitude);
    float h = p/cos(latitude) - N;
    latitude = degrees(latitude);
    longitude = degrees(longitude);
    return vec3(latitude, longitude, h);
}

vec3 LLH_TO_ECEF(in vec3 llh)
{
    float flattening = (radiusEquator - radiusPolar)/radiusEquator;
    float eccentricitySquared = 2 * flattening - flattening * flattening;
    float sin_latitude = sin(llh.x);
    float cos_latitude = cos(llh.x);
    float sin_longitude = sin(llh.y);
    float cos_longitude = cos(llh.y);
    float N = radiusEquator / sqrt(1.0 - eccentricitySquared * sin_latitude * sin_latitude);
    float x = (N + llh.z) * cos_latitude * cos_longitude;
    float y = (N + llh.z) * cos_latitude * sin_longitude; 
    float z = (N * (1 - eccentricitySquared) + llh.z) * sin_latitude;
    return vec3(x, y, z);
}

 

posted @ 2014-01-15 14:25  20118281131  阅读(739)  评论(0编辑  收藏  举报