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 在地球的北极放置一个雷达模型
自由软件开发者。承接图像处理,视频智能算法,GIS,三维仿真等方面的工程项目。联系方式 QQ or wechat: 714601476。

浙公网安备 33010602011771号