为OSG添加一个数字球(非OSGEarth方式)
2015-07-21 20:21
225 查看
在我的上一篇博客OSG嵌入Qt的第二种方式:使用QOpenGLWidget/QGLWidget中,在空旷的世界中只添加了cow,显得空旷,由于最近在做OSGEarth相关的开发,于是想着在OSG中怎么来添加一个数字球呢?
于是,来研究了下。发现,比我想象中的简单很多。
思路是:
- 在OSG中添加一个球,这个用
- 给新添的球设置一个半径为地球的半径,具体的就是WGS84坐标的参考半径
- 给球添加一个纹理,当然是全球影像了
- 给球添加经纬度坐标系统,可以利用
- 给球添加操作器,目前的OSG中并没有像OSGEarth那样的earth操作器,只能拿TerrainManipulator来用了。若想要OSGEarth中那样操作器的效果,只能自己写一个了。
下面的代码:
于是,来研究了下。发现,比我想象中的简单很多。
思路是:
- 在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);
相关文章推荐
- fork与vfork的区别
- eclipse 项目转as项目时 .so文件 jniLibs的设置
- storm - 基础概念整理
- eclipse 项目转as项目时 .so文件 jniLibs的设置
- 二分图多重匹配问题
- hive中的 数组越界异常 IndexOutOfBoundsException
- C语言入门学习小总结
- TableView的删除操作
- Webform——购物车
- poj 1028 Web Navigation 【模拟题】
- B. Quasi Binary
- 算法导论 第三十一章:数论
- #淘宝#复制分享宝贝内容,打开淘宝APP,自动弹出宝贝提示信息
- Cocos2d-x利用jni调用java层代码
- oracle 高级队列
- LeetCode#111 Minimum Depth of Binary Tree
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(六)Picker View视图 学习笔记
- 【Treap】poj1442 Black Box
- 修改UIImage大小
- select实现输入模糊匹配与选择双重功能