OSG(OpenSceneGraph)主要被用来展示三维,但目前需要在Qt5.0中显示二三维地图并进行开发,所以就想到了OSG。上网查了一下OSG支持的数据格式:大量常用的2D 图形文件格式,包括.bmp,.dds,.gif,.jpeg,.pic,.png,.rgb,.tga 和.tiff。OSG  支持的3D模型文件格式包括3D Studio Max(.3ds),AliasWavefront(.obj),Carbon Graphics’ Geo(.geo),Collada(.dae),ESRI Shapefile(.shp),OpenFlight(.flt),Quake(.md2)和Terrex TerraPage(.txp)等常见格式。编译什么的可以参考我之前的博客:https://blog.csdn.net/qq_38378235/article/details/80082141。今天主要来分享一下如何在OSG中加载shp数据,及一些简单的操作。

1、gis常用shp数据的加载

其实这部分操作也不难,是之前自己想复杂了,话不多说,用代码来说明:

//创建Viewer对象,场景浏览器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
//创建场景组节点
osg::ref_ptr<osg::Group> root = new osg::Group();
//创建节点,读取SHP文件
osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("region.shp");
osg::ref_ptr<osg::Node> node2 = osgDB::readNodeFile("line.shp");
osg::ref_ptr<osg::Node> node3 = osgDB::readNodeFile("point.shp");
//添加到场景
root->addChild(node1.get());
root->addChild(node2.get());
root->addChild(node3.get());
//优化场景数据
osgUtil::Optimizer optimizer ;
optimizer.optimize(root.get()) ;
//设置场景数据
viewer->setSceneData(root.get());
//初始化并创建窗口
viewer->realize();
//开始渲染
viewer->run();

这样gis中的点、线、面数据就能用OSG进行展示了,是不是觉得很简单和加载其他模型没有什么区别,当然这只是目前尝试的加载方法,能够显示并满足展示要求。

2、因为加载进去的点、线、面都是一样的颜色,因此只能看到最大层次的面数据,线和点层数据被覆盖了,因此通过修改不同node的颜色来区别以便显示查看,修改模型颜色主要参考网上的博客:https://blog.csdn.net/woaicd/article/details/77163012,代码如下:

#include <QCoreApplication>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Texture2D>
#include <osg/TexEnv>
#include <osg/TexGen>
osg::Image* createImage( int width, int height,osg::Vec3 color )
{osg::ref_ptr<osg::Image> image = new osg::Image;image->allocateImage( width, height, 1, GL_RGB, GL_UNSIGNED_BYTE );unsigned char* data = image->data();for ( int y=0; y<height; ++y ){for ( int x=0; x<width; ++x ){*(data++) = color.x();*(data++) = color.y();*(data++) = color.z();}}return image.release();
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);osgViewer::Viewer viewer;osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");if(model.valid()){osg::ref_ptr<osg::Image> image= createImage(256,256,osg::Vec3(255.0,1.0,0.0));if (image.get()){osg::ref_ptr<osg::Texture2D> texture=new osg::Texture2D();texture->setImage(image.get());//设置自动生成纹理坐标osg::ref_ptr<osg::TexGen> texgen=new osg::TexGen();texgen->setMode(osg::TexGen::NORMAL_MAP);//设置纹理环境,模式为BLENDosg::ref_ptr<osg::TexEnv> texenv=new osg::TexEnv;texenv->setMode(osg::TexEnv::Mode::ADD);texenv->setColor(osg::Vec4(0.6,0.6,0.6,0.0));//启动单元一自动生成纹理坐标,并使用纹理osg::ref_ptr<osg::StateSet> state=new osg::StateSet;state->setTextureAttributeAndModes(1,texture.get(),osg::StateAttribute::ON);state->setTextureAttributeAndModes(1,texgen.get(),osg::StateAttribute::ON);// state->setTextureAttribute(1,texenv.get());model->setStateSet(state.get());}viewer.setSceneData(model.get());}viewer.run();return a.exec();
}

3、改变节点姿态

OSG中通过旋转模型来改变节点的姿态,使用的类叫 MatrixTransform

//创建旋转矩阵
osg::MatrixTransform* rotateMT=new osg::MatrixTransform;
rotateMT->setMatrix(osg::Matrix::rotate(osg::inDegrees(-90.f),-1.0f,-1.0f,0.0f));
rotateMT->addChild(root);osg::MatrixTransform* mt=new osg::MatrixTransform;
mt->addChild(node4);
root->addChild(mt);
//设置场景数据
viewer->setSceneData(rotateMT);

说明:(1)在setMatrix的时候,使用osg::Matrix::rotate(osg::inDegrees(-90.0f), 0.0f, 0.0f, 1.0f) 构造了一个变换矩阵。

osg::Matrix::rotate这是Matrix类的静态函数,返回一个矩阵。一共有4个参数,第一个参数是角度,后面三个参数是旋转的向量坐标值。

(2)OSG中的旋转,通常是指绕着某个轴旋转一定角度。实参中的后三个参数(0.0f, 0.0f, 1.0f)实际指的是z轴的正半轴。

可以把坐标原点(0, 0, 0)看成向量起点,向量指向点(0.0f, 0.0f, 1.0f),这个点位于z轴坐标轴上,因为这个点的x=0, y=0, z=1。

4、改变背景颜色

osg默认的背景是蓝色的,画线是黑色,直观上有时候看着不好,想换成常用的白色,当然也可以换成其他图片做背景。

这里只说换颜色(以换成白色为例),代码就一句话:

//更变背景颜色
viewer->getCamera()->setClearColor(osg::Vec4f(1.0f,1.0f,1.0f,1.0f));  //white

参数RGB和透明度,可以随意改,直到修改到自己满意为止,现在的这个设置是底面为白色。

5、缩放改变节点大小

这个也是比较常用的功能,在视图模式下,通过缩放鼠标来改变节点的大小,一句代码就好,要提前#include <osgViewer/ViewerEventHandlers>

viewer->addEventHandler(new osgViewer::WindowSizeHandler);

好了,现在已经差不多了,源代码见:https://pan.baidu.com/s/1yD7pxzLz9_J99OlGdfaFSw

OSG中读取shp数据相关推荐

  1. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  2. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  3. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  4. C# 从Excel中读取时间数据

    之前写到从Excel中读取时间数据 //读取Excel数据Excel.Application xapp = new Excel.Application();string filepath = txt_ ...

  5. 从MySQL中读取股票数据——从零到实盘10

    前文介绍了把股票数据写入MySQL的过程,本文记录从MySQL中读取股票数据的过程. 到目前为止,我们在访问股票代码列表时,每次需要通过BaoStock重新下载.本文将把下载的股票代码保存到MySQL ...

  6. matlab处理记事本数据库,如何从Matlab的记事本文件中读取大块数据?

    如何从Matlab的记事本文件中读取大块数据? 我的数据采用以下格式: TABLE NUMBER 1 FILE: name_1 name_2 TIME name_3 day name_4 -0.01 ...

  7. R语言中读取excel数据的常用方式有哪些?

    R语言中读取excel数据的常用方式有哪些? 目录 R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R ...

  8. C# 操作地址 从内存中读取写入数据(初级)

    本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光 ...

  9. 【Kafka】从kafka中读取最新数据

    [Kafka]从kafka中读取最新数据 一.死循环无限拉取kafka数据 1.1 整体框架剖析 1.2 测试 二.@KafkaListener注解 实现监听kafka数据 三.参考资料 前情提要:我 ...

  10. 下载地图包,并基于python的pyshp库读取.shp数据来获取中国省界的经纬度数据

    目前画地图的软件都能很方便的调用省界数据,但是如果想要单独对省界做一些个性化设置,如设置宽度.样式.颜色什么的,就需要将省界数据单独拿出来进行设置了. 软件在画地图时,描述的边界都是一些列经纬度格点的 ...

最新文章

  1. ORACLE执行计划的一些基本概念
  2. yii2 设置的缓存无效,返回false,不存在
  3. 2021-03-20 GPS抽稀之道格拉斯-普克(Douglas-Peuker)算法
  4. ElasticSearch各种查询对象Query的使用
  5. filco蓝牙不好用_800元和300元的机械键盘差多少,Filco圣手104晒单
  6. 【年度盘点】最受欢迎的5大Java练习项目
  7. 帆软报表(finereport)单元格函数,OP参数
  8. 当 dotnet-monitor 遇上 Prometheus, 是种什么样的体验?
  9. 为多孔介质的当量直径_多孔介质流建模简介
  10. Java文档阅读笔记-C3P0连接池的使用
  11. ASP.NET部署与安装_MSI制作图文教程.
  12. 获取Access数据库中的用户表名
  13. 数据结构笔记:二叉树的构造(根据遍历顺序构造二叉树)
  14. 跨网段局域网如何互通_如何实现局域网中不同网段互访?企业网必备的高级静态路由...
  15. java 获取xml 版本号_java读取xml文件字段值
  16. mysql新建数据库并执行sql文件
  17. XP系统封装常用工具.ISO
  18. APP 微信支付java后台代码(解决支付失败返回-1)
  19. ewebeditor***
  20. 计算机网络常青藤讲义,宾语从句学习讲义

热门文章

  1. APISpace 手机号码归属地API
  2. 十五秒破解“还原卡”
  3. 5G模块M.2座子管脚和封装分析
  4. 沟通CTBS助大川集团集中部署K/3系统
  5. 易语言exe读写游戏例程源码_游戏工作室建立三步曲2019:脚本、防封与人工智能...
  6. 【设计模式】代理模式
  7. 药品管理系统java_基于Java的药品管理系统
  8. 【非参数统计】概念及方法归纳比较(超适合期末复习)
  9. Windows系统win10系统压缩解压软件推荐
  10. jsp项目如何引入vue