2.3.17 坐标系节点
坐标系节点(osg::CoordinateSystemNode)继承自osg::Group节点,它的主要作用是使一个场景的对象关联一个坐标系统。通常的坐标系统类型有WKT、PROJ4和USGS,它通常与osg::EllipsoidModel节点一起使用,osg::EllipsoidModel节点(椭圆体模型节点)主要用来模拟天体,如太阳、行星和月亮等,其默认情况下是地球体。osg::EllipsoidModel节点还有个作用是实现经纬度与坐标之间的转换,这样可以实现天体椭圆体模型子节点的精确定位。当建立地球数据库时,这个节点会非常有用,可以根据地球椭圆体模型实现子节点的精确定位。
对于WKT坐标系,可能很多人都不理解,它的定义包括以下几个方面:
- 一个全局的坐标系统名称
- 一个地理坐标系统的名称
- 一个数据识别器
- 一个椭球体的名称、长半轴、扁率。
- 本初子午线的名称和它到格林尼治的偏移量
- 投影类型(如横轴墨卡托投影)
- 投影参数(如中央子午线)
- 单位名称,到米或弧度的转换因数
- 各轴的名称和顺序
- 由授权单位预先定义的大多数坐标系统的代码
2.3.18 坐标系节点示例代码
#include<osgViewer/Viewer>
#include<osg/Node>
#include<osg/Geode>
#include<osg/Group>
#include<osg/CoordinateSystemNode>
#include<osg/ShapeDrawable>
#include<osgDB/ReadFile>
#include<osgDB/WriteFile>
#include<osgUtil/Optimizer>
//--------------------------------------------------
// 绘制一个地球
osg::ref_ptr<osg::Node> createEarth()
{
// 创建一个地球
osg::ref_ptr<osg::ShapeDrawable> sd = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0,0.0,0.0),osg::WGS_84_RADIUS_POLAR));
// 添加到叶节点
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(sd.get());
// 设置纹理
std::string filename("Image/land_shallow_topo_2048.jpg");
geode->getOrCreateStateSet()->setTextureAttributeAndModes(0,new osg::Texture2D(osgDB::readImageFile(filename)));
// 创建坐标系节点
osg::ref_ptr<osg::CoordinateSystemNode> csn = new osg::CoordinateSystemNode;
// 设置椭圆体模型,默认的坐标系WGS-84
csn->setEllipsoidModel(new osg::EllipsoidModel());
csn->addChild(geode.get());
return csn.get();
}
//-----------------------------------------------------
int main()
{
// 创建Viewer对象,场景浏览器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::Group>root = new osg::Group();
// 添加到场景
root->addChild(createEarth());
// 优化场景数据
osgUtil::Optimizer = optimizer;
optimizer.optimize(root.get());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0;
}