liblas读取点云,设置半透明

news2024/11/30 12:26:34

一,用Liblas读取点云数据,获取点云位置和颜色
二,将点云位置和颜色分别代入geode的位置数组和颜色数组
三,用glsl设置半透明。需要注意的是
1,颜色数组是用attribute,所以要用
geom->setVertexAttribArray(10, colors, osg::Array::BIND_PER_VERTEX);
program->addBindAttribLocation(“colors”, 10);
2,由于颜色数组是绑定到顶点的,所以要在shader中把颜色从顶点着色器传递到片元着色器。

“varying vec4 outColors;”
3,alpha值是uniform,所以在stateset中设置
osg::ref_ptrosg::Uniform alphaValue = new osg::Uniform(“alpha”, 0.1f);
stateset->addUniform(alphaValue);
4,开启混合
stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

代码如下:
//通过Liblas读取.las文件,并在osg中显示出来,用shader,先在片元着色器指定使用绿色
#include <liblas/liblas.hpp>
#include
#include

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>

#include <osg/Switch>
#include <osg/Types>
#include <osgText/Text>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>

#include <osgGA/Device>

#include
#include <osg/Shader>

osg::ref_ptrosg::Geode getGeodeFromLas(std::string strLasFileName)
{

std::ifstream ifs;
ifs.open(strLasFileName, std::ios::in | std::ios::binary);

liblas::ReaderFactory f;

liblas::Reader reader = f.CreateWithStream(ifs);
liblas::Header const& header = reader.GetHeader();
int pointCount = header.GetPointRecordsCount();
std::cout << "pointCount:" << pointCount << std::endl;

osg::ref_ptr<osg::Geode> geode = new osg::Geode;
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
for (int i = 0; i < pointCount; i++)
{
	bool readSuccess = reader.ReadPointAt(i);
	if (!readSuccess)
	{
		continue;
	}
	liblas::Point const& p = reader.GetPoint();
	float red = p.GetColor().GetRed() * 1.0 / 65535;
	//float green = p.GetColor().GetGreen()* 1.0 / 65535;
	float green = 1.0;
	float blue = p.GetColor().GetBlue()* 1.0 / 65535;
	//	std::cout << "red =" << red << ";green=" << green << ";blue=" << blue << std::endl;
	colors->push_back(osg::Vec4(red, green, blue, 1.0)); //这里强制把颜色设置为蓝色
	double x = p.GetX();
	double y = p.GetY();
	double z = p.GetZ();
	//	std::cout << "x =" << x << ";y=" << y << ";z=" << z << std::endl;
	vertices->push_back(osg::Vec3(x, y, z));
}
geom->setVertexAttribArray(10, colors, osg::Array::BIND_PER_VERTEX);
geom->setColorArray(colors, osg::Array::BIND_PER_VERTEX);
geom->setVertexArray(vertices);
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, vertices->size()));
geode->addDrawable(geom);
return geode.release();

}

static const char * vertexShader =
{
“in vec4 colors;\n”
“varying vec4 outColors;”
“void main(void)\n”
“{\n”
“outColors = colors;”
" gl_Position = ftransform();\n"
“}\n”
};
static const char *psShader =
{
“uniform float alpha;”
“varying vec4 outColors;”
“void main(void)\n”
“{\n”
//“gl_FragColor = vec4(0.0f,1.0f,0.0f,1.0);\n”
“gl_FragColor = outColors;\n”
“gl_FragColor.a = alpha;\n”
“}\n”
};

int main()
{
//std::string strLasFileName = “d:/ddss.las”;
std::string strLasFileName = “d:/test.las”;

osg::ref_ptr<osg::Group> grp = new osg::Group;
osg::ref_ptr<osg::Geode> geode = getGeodeFromLas(strLasFileName);
grp->addChild(geode);
osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet();
stateset->setMode(GL_BLEND, osg::StateAttribute::ON);
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
osg::ref_ptr<osg::Shader> vs = new osg::Shader(osg::Shader::VERTEX, vertexShader);
osg::ref_ptr<osg::Shader> ps = new osg::Shader(osg::Shader::FRAGMENT, psShader);
osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader(vs);
program->addShader(ps);
program->addBindAttribLocation("colors", 10);
osg::ref_ptr<osg::Uniform> alphaValue = new osg::Uniform("alpha", 0.1f);
stateset->addUniform(alphaValue);
stateset->setAttribute(program, osg::StateAttribute::ON);
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(grp);
viewer->run();
return 0;

}

运行结果:alpha = 0.1时,
在这里插入图片描述
alpha = 0.5时
在这里插入图片描述
alpha = 1.0时,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark抓包分析DHCP

1、DHCP简介动态主机设置协议&#xff08;英语&#xff1a;Dynamic Host Configuration Protocol&#xff0c;DHCP&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用于内部网或网络服务供应商自动分配IP地址&#xff1b…

从0到1完成一个Vue后台管理项目(十五、作业列表、表格数据方法的封装)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

解决虚拟机安装 VMware Tools 灰色无法点击问题

环境&#xff1a; 主机 OS: Windows 11 虚拟机平台: VMware Workstation 17 Pro 虚拟系统: Ubuntu 22.04 1. 问题 安装好 Linux 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工具&#xff0c;最简单的办法就是通过虚拟机平台的 “一键安装”&a…

Java之ATM系统

目录项目介绍系统准备&#xff0c;首页设计总结开户功能总结用户登录总结用户操作页设计、查询账户、退出账户功能用户存钱取款功能转账功能密码修改、销户源代码项目介绍 系统准备&#xff0c;首页设计 总结 1、用户的账户信息&#xff0c;系统如何表示的? 定义账户类Accoun…

【CVHub】现代目标检测故事 | 40+目标检测网络架构大盘点!从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2

本文来源“CVHub”公众号&#xff0c;侵权删&#xff0c;干货满满。 作者丨派派星 来源丨CVHub 原文链接&#xff1a;现代目标检测故事 | 40种网络架构大盘点&#xff01;从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2 导读 目标检测是指在图像或视频中分…

PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片&#xff0c;集成32-bit高性能低功耗MCU&#xff0c;16KB OTP&#xff0c;8KB Retention SRAM和64KB ROM&#xff0c;可选EEPROM。内置高性能多模射频收发机最大发射功率10dBm&#xff0c;BLE 1Mbps速率下接收灵敏…

快手发布2022直播生态报告,运营人速览

1、快手电商推出2023年直播间联合补贴活动1月5日&#xff0c;快手电商推出2023年直播间联合补贴活动。该活动主要目的是助力主播完成更高销售额&#xff0c;报名成功后&#xff0c;平台将对直播间内的一部分活跃用户发放10%-16%折扣率的满减优惠券&#xff0c;成本由平台和主播…

【BUG解决方案】jQuery数组中包含数据,但通过 .length 获得的数组长度始终为0

0. BUG展示 var lels []; for (var i 0; i < maxDevNums 1; i) {lels.push([]); } $.ajax({type : "post",async : true,url : "/sc/comb/history/data",data : {},dataType : "json",success : function (result) {if (result) {for (le…

FFmpeg 集成 x265 编译及解码

x265 是一个免费的软件库和应用程序&#xff0c;用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式&#xff0c;并在 GNU GPL 条款下发布。 FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译&#xff0c;在编译 FFmpeg 之前需要先编译 x265&#xff0c;但并不是所有的版本都能…

Python一轮知识拾遗

目录 字符串格式化 %格式符 format字符串格式化 三元条件运算符 可迭代对象 break和continue语句 enumerate函数 序列封包 序列解包 部分序列解包 append.列表和extend.列表的区别 字符串格式化 通过字符串的格式化&#xff0c;可以输出特定格式的字符串。 (1) 格式化…

为什么要申报绿色工厂?

一、什么是绿色工厂&#xff1f; 绿色工厂是指实现了用地集约化、生产洁净化、废物资源化、能源低碳化的工厂。 二、为什么要申报绿色工厂&#xff1f; 1、政策导向&#xff0c;发展趋势 发展绿色工厂是顺应全球绿色发展的大趋势&#xff0c;符合国家政策导向。 2、荣誉称号…

[笔记]Windows Cyswin ssh配置及远程控制

文章目录前言一、配置1.1 安装 Cygwin1.2 Cygwin安装时搜索安装ssh1.3 添加cygwin安装目录至Path环境变量1.4 配置 SSHD 服务1.5 添加 sshd连接账号二、使用2.1 使用配置的连接账号进行登录2.2 连接远程主机三、常见问题3.1 ssh on cygwin和openssh 冲突 提示 Host key verific…

新增血缘关系功能,色彩地图支持标记功能,DataEase开源数据可视化分析平台v1.18.0发布

2023年1月9日&#xff0c;DataEase开源数据可视化分析平台正式发布v1.18.0版本。 这一版本的功能升级包括&#xff1a;数据集方面&#xff0c;定时任务采用分页的方式拉取数据&#xff0c;减少资源消耗&#xff1b;仪表板方面&#xff0c;新增仪表板主题&#xff0c;以满足不同…

二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】

目录 1、什么是二叉搜索树&#xff1f; 2、手动模拟二叉搜索树 2.1、整体代码 2.2、查找数据 2.3、插入数据 2.4、删除数据 3、性能分析 1、什么是二叉搜索树&#xff1f; 二叉搜索树也叫作二叉排序树&#xff0c;可以使一颗空树&#xff0c;也可以是具有以下性质的二…

JavaScript 高级 内存管理和闭包

这里写目录标题1. JavaScript内存管理2. 垃圾回收机制算法1. 引用计数算法2. 标记清除算法3. 闭包的概念理解4. 内存泄露5. 面试题1. JavaScript内存管理 不管什么样的编程语言&#xff0c;在代码的执行过程中都是需要给它分配内存的&#xff0c;不同的是某些编程语言需要我们…

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中&#xff0c;我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能&#xff0c;都有不错的表现效果&#xff0c;本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能&#xff0c;首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言&#xff1a; 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言&#xff1a; 在遵循…

模块化建筑全球市场分析

模块化市场分析 市场摘要 全球模块化建筑市场&#xff0c;预计从2019年的1199亿6千万美元&#xff0c;到2027年的1916亿2千万&#xff0c;以6.4%的年复合成长率成长。人口增加&#xff0c;快速城市化和基础设施发展投资增加是预测期内刺激市场增长的关键因素。模块化施工是最可…

【C进阶】第十三篇——指针详解

指针的基本概念 指针类型的参数和返回值 指针与数组 指针与const限定符 指针与结构体 指向指针的指针与指针数组 指向数组的指针与多维数组 函数类型和函数指针类型 不完全类型和复杂声明 指针的基本概念 堆栈有栈顶指针&#xff0c;队列有头指针和尾指针&#xff0c;…

C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法

1. 前言 因无向、无加权图的任意顶点之间的最短路径由顶点之间的边数决定&#xff0c;可以直接使用原始定义的广度优先搜索算法查找。 但是&#xff0c;无论是有向、还是无向&#xff0c;只要是加权图&#xff0c;最短路径长度的定义是&#xff1a;起点到终点之间所有路径中权…