您的位置:首页 > 其它

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

2015-07-21 20:21 225 查看
在我的上一篇博客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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: