osgearth 代码 hack(一) GeoTransfrom 如何工作

 
bool
SpatialReference::createLocalToWorld(const osg::Vec3d& xyz, osg::Matrixd& out_local2world ) const

  

这个代码看起来似乎是从一个点生成一个局部到世界的矩阵。 问题:如何从一个点生成一个matrix呢?

trix呢?

 
跟踪发现, 这个函数调用了osg里面的函数
 
inline void EllipsoidModel::computeLocalToWorldTransformFromXYZ(double X, double Y, double Z, osg::Matrixd& localToWorld) const
{
    double  latitude, longitude, height;
    convertXYZToLatLongHeight(X,Y,Z,latitude,longitude,height);
 
    localToWorld.makeTranslate(X,Y,Z);
    computeCoordinateFrame(latitude, longitude, localToWorld);
}

 这里可以看出,从x, y, z 得到经纬度。 然后从经纬度算出 localToWorld矩阵。 那么问题来了, 这个矩阵跟这个固定的经纬度是什么关系?

继续跟踪:

 

inline void EllipsoidModel::computeCoordinateFrame(double latitude, double longitude, osg::Matrixd& localToWorld) const
{
    // Compute up vector
    osg::Vec3d    up      ( cos(longitude)*cos(latitude), sin(longitude)*cos(latitude), sin(latitude));
    // Compute east vector
    osg::Vec3d    east    (-sin(longitude), cos(longitude), 0);
    // Compute north vector = outer product up x east
    osg::Vec3d    north   = up ^ east;
    // set matrix
    localToWorld(0,0) = east[0];
    localToWorld(0,1) = east[1];
    localToWorld(0,2) = east[2];

    localToWorld(1,0) = north[0];
    localToWorld(1,1) = north[1];
    localToWorld(1,2) = north[2];

    localToWorld(2,0) = up[0];
    localToWorld(2,1) = up[1];
    localToWorld(2,2) = up[2];
}

  可以看出,上面这个函数就是生成了一个旋转矩阵。 结合上面的那个平移的代码

localToWorld.makeTranslate(X,Y,Z);

 可以看出,生成的这个矩阵是一个旋转平移矩阵。而且是先旋转,后平移。 

 有了以上的基础, 接下来分析

bool
GeoTransform::setPosition(const GeoPoint& position)
{
     ...

    _position = position;

    GeoPoint p;

    // transform into terrain SRS if neccesary:
    if (terrain.valid() && !terrain->getSRS()->isEquivalentTo(position.getSRS()))
        p = position.transform(terrain->getSRS());
    else
        p = position;

    ...
   
    // assemble the matrix:
    osg::Matrixd local2world;
    p.createLocalToWorld( local2world );
    this->setMatrix( local2world );

    ...

    return true;
}

   GeoTransform 实际是根据设置的point (GeoPoint), 得到一个矩阵, 将这个矩阵设置为自己的变换matrix. 任何用局部坐标表示的Node , 只要挂载在GeoTransform的下面,那么

都会被“移动”到指定的GeoPoint的位置。下面的例子,用geotransform 在地球的北极放置一个雷达模型

 

posted @ 2020-04-26 15:14  小阳明  阅读(1457)  评论(0)    收藏  举报