为OSG添加一个数字球(非OSGEarth方式)

在我的上一篇博客OSG嵌入Qt的第二种方式:使用QOpenGLWidget/QGLWidget中,在空旷的世界中只添加了cow,显得空旷,由于最近在做OSGEarth相关的开发,于是想着在OSG中怎么来添加一个数字球呢?
于是,来研究了下。发现,比我想象中的简单很多。
思路是:
- 在OSG中添加一个球,这个用osg::Sphere实现
- 给新添的球设置一个半径为地球的半径,具体的就是WGS84坐标的参考半径
- 给球添加一个纹理,当然是全球影像了
- 给球添加经纬度坐标系统,可以利用osg::CoordinateSystemNode实现
- 给球添加操作器,目前的OSG中并没有像OSGEarth那样的earth操作器,只能拿TerrainManipulator来用了。若想要OSGEarth中那样操作器的效果,只能自己写一个了。
下面的代码:

    // 精细度设置
    osg::TessellationHints* hints = new osg::TessellationHints;
    hints->setDetailRatio(5.0f);
    // 新建半径为WGS84参考半径的球
    osg::ShapeDrawable* sd = new osg::ShapeDrawable(
        new osg::Sphere(osg::Vec3(0.0, 0.0, 0.0), osg::WGS_84_RADIUS_POLAR), hints);

    osg::Geode* geode = new osg::Geode;
    geode->addDrawable(sd);

    // 添加全球的纹理,图片的OSG资源Data中的图片
    geode->getOrCreateStateSet()->setTextureAttributeAndModes(0,
        new osg::Texture2D(osgDB::readImageFile("Images/land_shallow_topo_2048.jpg")));

    // 经纬度坐标处理
    osg::CoordinateSystemNode* csn = new osg::CoordinateSystemNode;
    csn->setEllipsoidModel(new osg::EllipsoidModel());
    csn->addChild(geode);

    m_pRoot->addChild(csn);

    this->getCamera()->setNearFarRatio(0.00001f);

    // 操作器,不是很好用的
    this->setCameraManipulator(new osgGA::TerrainManipulator);

你可能感兴趣的:(OSG/Qt)