osg之显示点云

osg虽然不是很火,但是对于非计算机专业的人来说确实是一个神器,osg其实也是来自于opengl,它可以理解为一个高度封装的opengl图像库,由于其没有太多太多的技术门槛以及扩展性不高,导致其市场一直不温不火,但是其封装的LOD技术,多线程技术以及显示还是为急需做平台又不想投入大量时间的人提供了便利。博主就是属于其中之一,由于点云数据越来越大,如今数据点不超过1个亿都不好意思称作大数据。由于opengl的LOD技术国内在这方面保密甚为严格,当然各行各业都是这样,这也是国内技术一直远远落后于国外的原因之一吧!其实很多工具真的很有用,但是苦于没有入门教程,所以只能望洋兴叹,这也是国内编程技术的现状之一吧!目前博主也是尽自己的一点绵薄之力把一些有用的入门教程奉献给大家,希望能给那些还在点云显示道路上挣扎的人一点点帮助!同时也呼吁大家能把一些并没有什么核心竞争力的编程知识共享一下,因为每一篇有用的博客都有可能开启一个人的编程之路,废话不多说,直接上代码,保证直接运行可用。

bool rgbIsInt=false;

	/*osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
	viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));*/
	osg::ref_ptr<osg::Group> root = new osg::Group();

	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
	{
		osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
		traits->x = 40;
		traits->y = 40;
		traits->width = 600;
		traits->height = 480;
		traits->windowDecoration = true;
		traits->doubleBuffer = true;
		traits->sharedContext = 0;

		osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

		osg::ref_ptr<osg::Camera> camera = new osg::Camera;
		camera->setGraphicsContext(gc.get());
		camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
		GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
		camera->setDrawBuffer(buffer);
		camera->setReadBuffer(buffer);

		// add this slave camera to the viewer, with a shift left of the projection matrix
		viewer->addSlave(camera.get());
	}

	//创建顶点数组
	osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array();
	osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array();

	//快速读取文件
	string filePath = "整数.txt";//mcolor_小数  ZSWZ2015111
	FILE* pfData = fopen(filePath.c_str(), "r");

	ifstream fileIn(filePath, ios::in);//读取文件
	string line;//读取了每一行的字符

	getline(fileIn, line);//获取第一行
	stringstream sstr(line);//给他转一下
	string token;

	int lineInNum=0;
	while (getline(sstr, token, ‘ ‘))
	{
		lineInNum ++ ;
		if (lineInNum >= 3)
		{
			if (stof(token)> 1)
			{
				rgbIsInt = true;
			}

		}

	}

	int num = 0;//数据点数量
	if (pfData == NULL)
	{
		cout << "DataFile does not exist!!!" << endl;
		return NULL;
	}
	else
	{
		if (rgbIsInt == false)//读小数
		{
			while (!feof(pfData))
			{
				float fx, fy, fz, n, m, k;
				float fa, fb, fc;
				fscanf(pfData, "%f", &fx);
				fscanf(pfData, "%f", &fy);
				fscanf(pfData, "%f", &fz);
				fscanf(pfData, "%f", &fa);
				fscanf(pfData, "%f", &fb);
				fscanf(pfData, "%f", &fc);
				coords->push_back(osg::Vec3(fx, fy, fz));
				color->push_back(osg::Vec4(fa, fb, fc, 1.0f));
				num++;
			}
		}
		else//读整数
		{
			while (!feof(pfData))
			{
				float fx, fy, fz;
				int fa, fb, fc;
				fscanf(pfData, "%f", &fx);
				fscanf(pfData, "%f", &fy);
				fscanf(pfData, "%f", &fz);
				fscanf(pfData, "%d", &fa);
				fscanf(pfData, "%d", &fb);
				fscanf(pfData, "%d", &fc);
				float aa = (float)fa / 255.00;
				float bb = (float)fb / 255.00;
				float cc = (float)fc / 255.00;
				coords->push_back(osg::Vec3(fx, fy, fz));
				color->push_back(osg::Vec4(aa, bb, cc, 1.0f));
				num++;
			}
		}
		fclose(pfData);
	}

	//创建几何体
	osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
	//设置顶点数组
	geometry->setVertexArray(coords.get());
	geometry->setColorArray(color.get());
	geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

	osg::Vec3Array *normals = new osg::Vec3Array;
	normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
	//geometry->setNormalArray(normals);
	//geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
	geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, num)); //设置关联方式

	//添加到叶节点
	osg::ref_ptr<osg::Geode> geode = new osg::Geode();
	geode->addDrawable(geometry.get());
	root->addChild(geode.get());

	root->getOrCreateStateSet()->setMode(GL_LIGHTING, StateAttribute::OFF | StateAttribute::OVERRIDE);

	//优化场景数据
	osgUtil::Optimizer optimizer;
	optimizer.optimize(root.get());
	viewer->setSceneData(root.get());

	viewer->realize();
	viewer->run();
	return viewer->run();

  这是运行效果:

后期会把osg嵌入到Qt的方法贡献给大家,由于目前博主也在学习阶段,感觉还是控制台学习较为方便。

原文地址:https://www.cnblogs.com/z-web-2017/p/9783647.html

时间: 2024-10-29 02:49:20

osg之显示点云的相关文章

使用OSG显示点云时,如何正确将空白处屏幕坐标转为最接近点云的世界坐标

在OSG中绘制点云,实现画/测点.线等功能时,需要捕捉点云的坐标,但是要在空白区域绘制或测量时,就获取不到点云坐标了. 为了解决这个问题,自己推导出一个将点云空白处屏幕坐标转为最接近点云坐标的算法: 思路是:在每一次捕获真实点云时,即记录下当前点云坐标(lastCloudPoint):空白区域测点时,先将屏幕坐标转为虚拟的世界坐标,然后将坐标投影到 由 eye→center方向(eyeForward)作为法线且经过lastCloudPoint 的虚拟平面上,进而得到最靠近点云的坐标. 实际上,先

PCL Show Point Cloud 显示点云

在使用PCL库的时候,经常需要显示点云,可以用下面这段代码: #include <pcl/visualization/cloud_viewer.h> pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud; pcl::visualization::CloudViewer viewer ("Viewer"); viewer.showCloud (cloud); while (!viewer.wasStopped ()) { }

PCL入门—点云操作 定义变量 显示点云 存储

1 // 定义相关变量 2 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>); 3 pcl::PointCloud<pcl::PointXYZ>& cloud = *cloud_ptr; //点云 4 //初始化点云数据PCD文件头 5 cloud.width = depthHeight * depthWidth; 6 cloud.height =

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 云平台显示单片机采集的温湿度数据,控制设备继电器(基于ESP8266,AT指令TCP_MQTT通信)(V1.0)

实现的功能 把单片机采集的温湿度显示在云平台 实现步骤1 1.在云平台再弄一个自定义功能 实现步骤2 我就是修改的这一节的单片机程序 https://www.cnblogs.com/yangfengwu/p/12539421.html 1.为了方便大家使用,我修改成了下面 用户直接根据自己的修改就可以 2.我设置的发布主题 3.我设置的订阅主题 下载单片机程序然后测试 一,调整波动开关位置,STM32和Wi-Fi通信 二,短接STM32的PB2和Wi-Fi模块的RST引脚(为了做项目稳定可靠,请

十年一场云之战,重建这些科技公司与人的技术信仰

2006年是一个开始,当时一个叫做Amazon Web Service的小业务,掀起了一场十年之久.席卷全球的云计算狂潮. 从2000左右年开始的互联网大潮已经让很多科技企业对互联网盲目崇拜,然而自2006年由亚马逊开始的一场云之战,才让更多的传统科技企业彻底失去了方向.因为源自亚马逊的AWS云计算模式,彻底颠覆了微软.IBM.VMware.Oracle.Cisco.HP等一系列曾经的科技巨头,这些曾经被全球其它所有科技公司视为风向标的公司终于风光不在,转而各自寻找新生存与发展方向. 2017年

使用Python定制词云

一.实验介绍 1.1 实验内容 在互联网时代,人们获取信息的途径多种多样,大量的信息涌入到人们的视线中.如何从浩如烟海的信息中提炼出关键信息,滤除垃圾信息,一直是现代人关注的问题.在这个信息爆炸的时代,我们每时每刻都要更新自己的知识储备,而网络是最好的学习平台.对信息过滤和处理能力强,学习效率就会得到提高."词云"就是为此而诞生的."词云"是对网络文本中出现频率较高的"关键词"予以视觉上的突出,形成"关键词云层"或"

PCL+Qt+VS可视化点云

前言 Point Cloud Library (PCL)是一个功能强大的开源C++库,如果能够使用好PCL将会对我们在LiDAR数据处理领域的研究产生巨大帮助.LiDAR技术经过几十年的发展,目前国内外关于LiDAR点云数据处理的文献已很丰富,但是依然存在硬件上的发展速度大于软件的发展速度.PCL中的算法基于众多的科研人员和程序爱好者的无私贡献才有今天强大的PCL. 博文中,我将针对如何结合PCL和Qt库做一个可视化点云的程序.这部分内容在PCL官网已有几个例子并且都能够很好的使用,而且UI也是

用七年时间造出的阿里云,如今三句话告诉你是什么

马云在2016年10月杭州云栖大会的主题演讲中只字未提"阿里云",但这并不说明阿里云不重要,而是在某种意义上说明在马云的心里,阿里云"从0到1"的阶段已经完成了. 在10月13日杭州云栖大会开幕当天,马云发表了就上一财年致股东信,信中提及阿里云承载了中国35%的网站并为之提供云计算和大数据的服务,而截至2016年3月31日的阿里财报显示阿里云拥有超过230万用户,其中云计算付费用户达50万. 从2009年2月写下阿里云的第一段代码开始,阿里云上上下下的负责人们就一直

震动云产业的王健林为什么与IBM云和认知计算在一起?

2017年3月19日,震动中外云计算产业的一幕发生了:IBM董事长.总裁.首席执行官罗睿兰与万达集团董事长王健林站在了一起,双方在北京签订了历史性的战略合作协议.万达将向国内引入IBM云服务与认知计算解决方案,从而全面进军高价值的公有云和企业数字化转型服务市场. 2017年1月,万达集团刚发布了2016年财报,其中服务业收入占比55%,历史上首次超过房地产,未经审计的净利润也大于房地产.而2016年10月刚成立的万达网络科技集团在2016年营收达41.9亿元,连通线上线下的新型电商平台飞凡的活跃