因任务需求,需要实现Unity中点云的渲染,同时将点云与模型相结合,达到点云在模型上特定位置的绑定。经相关探索,特此记录。


前言

在Unity中实现点云的渲染可以采用相关的插件,例如PCX插件,可以直接实现在Unity编辑器对PLY格式点云的识别,可直接拖拽到场景中并待颜色显示。但是该插件的缺点在于,相关操作需要预先在编辑器中定义,不能动态的通过脚本控制点云文件的加载与渲染。

为了实现点云在Unity程序中的动态加载与渲染,采用文件读取与Mesh渲染详解和方法。

具体实现思路为:读取点云文件中的明码信息(包括xyz和rgb),储存在C#的容器中,后期通过遍历数据,为Mesh舒服,实现渲染,过程如下。


一、点云文件数据

1.文件有效信息

点云文件的储存形式很多:PCD、PLY、XYZ、XYZRGB、CSV等等,同时文件中点云的储存格式也不尽相同。本文适用于文件中储存的点云信息为明码,如PCD的ascii编码形式或CSV格式,如下图:
PCD-ascii:

CSV:

其他格式的文件也可以进行读取,只需保证Unity在解析文件信息时能够处理掉无用信息,保留点云信息。如PCD文件,前11行信息为PCD的标准格式,可以在PCL程序中进行解析,但在本例中只需要保留点云信息即可。

因此读者在使用时可以采用文件预处理(手动将非有效信息删除)或后处理(通过程序删掉特定行数据)的形式保留有效点云信息,在此不再赘述。

2. rgb信息

如上图可见,pcd文件中的rgb值是无符号单值,U:可表示uint8,unit16,uint32,但是我们在Unity中对Mesh的颜色赋值的时候是需要得到RGB的值各是多少,因此需要进行处理:

long nrgb = long.Parse(words[3]);//获取第四列信息
long nr = (nrgb >> 16) & 0x0000ff;
long ng = (nrgb >> 8) & 0x0000ff;
long nb = (nrgb) & 0x0000ff;Vector3 rgb = new Vector3(nr/255f, ng/255f, nb/255f);//尤其注意,将0-255的数值映射到0-1区间中

二、点云渲染

为点云数据创建Mesh:

void CreateMesh()
{int num = _List[0].Count;_PointNum = num;GameObject pointObj = new GameObject();pointObj.name = "PointCloud";// 绑定Mesh组件pointObj.AddComponent<MeshFilter>();pointObj.AddComponent<MeshRenderer>();// 为点云创建新的MeshMesh meshNeed = new Mesh();Material mat = new Material(Shader.Find("Custom/VertexColor"));pointObj.GetComponent<MeshFilter>().mesh = meshNeed;pointObj.GetComponent<MeshRenderer>().material = mat;Vector3[] points = new Vector3[num];Color[] colors = new Color[num];int[] indecies = new int[num];for (int i = 0; i < num; ++i){points[i] = (Vector3)_List[0][i];indecies[i] = i;colors[i] = (Color)_List[1][i];}meshNeed.vertices = points;meshNeed.colors = colors;meshNeed.SetIndices(indecies, MeshTopology.Points, 0);// 设置Mesh的渲染类型为Point
}

其中Shader的代码如下:

Shader "Custom/VertexColor" {SubShader {Pass {LOD 200CGPROGRAM#pragma vertex vert#pragma fragment fragstruct VertexInput {float4 v : POSITION;float4 color: COLOR;};struct VertexOutput {float4 pos : SV_POSITION;float4 col : COLOR;};VertexOutput vert(VertexInput v) {VertexOutput o;o.pos = UnityObjectToClipPos(v.v);o.col = v.color;return o;}float4 frag(VertexOutput o) : COLOR {return o.col;}ENDCG} }}

通过以上可以实现对点云的Mesh渲染,但是存在问题:一个Mesh默认可渲染的顶点数最多为65535,可查看API ,当要渲染的点数过多时就会出现渲染一部分的问题,解决思路:

1.循环创建Mesh,一个GameObject包含多个Mesh,单个Mesh包含60000个顶点;

2.API已经说的很清楚,Mesh的索引缓冲区数据类型可更改为32位,最多支持40亿个顶点数据;

Mesh.SetIndexBufferParams(Num, UnityEngine.Rendering.IndexFormat.UInt32);

以上可实现大尺度点云数据在一个Mesh中的渲染。

三、点云数据与模型数据绑定

本人的点云数据在Unity程序外通过PCL进行处理,实现点云坐标系和模型坐标系的统一,故在Unity导入点云数据后点云与模型的关系是绑定的。

需要注意的是:PCL中点云坐标系为右手系,Unity模型坐标系为左手系,需要进行左右手的转化。

效果如下:


总结

如上实现Unity中PointCloud的Mesh渲染,欢迎批评指正。

我最大的梦想就是成为你的梦想 .HDarker

Unity PointCloud开发:Mesh渲染点云相关推荐

  1. HoloLens 2开发:Pcx 渲染点云单眼显示问题

    前言 最近有新成员加入本团队,为了方便其开发HoloLens1 / HoloLens2,将不定时更新HoloLens相关开发相关内容. 软件需求: HoloLens 1:VS2017 + Unity2 ...

  2. Unity VR开发中UI始终优先渲染不被物体遮挡

    Unity VR开发中UI始终优先渲染不被物体遮挡 在用Vive开发VR的时候,3DUI很容易被场景中的物体遮挡,解决办法是使用一个Shader:Overlay.shader,这个shader很好找, ...

  3. 最全面的Unity游戏开发指南视频教程 第2卷

    最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...

  4. Unity客户端开发面试题记录

    Unity客户端开发面试题记录 1.如何理解面向对象思想 A:面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节.面向对象的特征是:封装,继承,多态.多态就是接口的多种不同 ...

  5. Unity游戏开发视频教程 第2卷

    从完全的初学者到专业的游戏开发者.学习用C#编写代码,用Unity创建令人惊叹的游戏 Unity游戏开发视频教程 第2卷 你会学到什么 了解如何编写高级C#代码 学习好的编码原则和设计实践 发展强大的 ...

  6. 《Unity虚拟现实开发实战》——第3章,第3.6节虚拟现实设备的运行原理

    本节书摘来自华章出版社<Unity虚拟现实开发实战>一书中的第3章,第3.6节虚拟现实设备的运行原理,作者[美] 乔纳森·林诺维斯,更多章节内容可以访问云栖社区"华章计算机&qu ...

  7. 1.15 从0开始学习Unity游戏开发--游戏UI

    上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的近 ...

  8. Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

    Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着 ...

  9. echart 实例显示位置_技术分享:如何在Unity中使用实例化渲染?

    编者按 在日常开发中,通常说到优化.提高帧率时,总是会提到批量渲染.之前简单总结了静态合批(点此查看全文)以及动态合批(点此查看全文),这次作者将和大家聊聊实例化渲染. 作者:枸杞忧天 (本文内容由公 ...

最新文章

  1. 循序渐进 OSPF的详细剖析(三)
  2. Android编译笔记三
  3. ReactJS入门之JSX语法
  4. Ubuntu 16.04上安装SkyEye及测试
  5. 【OpenCV 例程200篇】77. OpenCV 实现快速傅里叶变换
  6. Git Stash的使用方法与注意事项
  7. 鸿蒙OS最快6月正式推送;微信Windows版将支持刷朋友圈;GCC 11.1正式发布|极客头条...
  8. 51单片机学习笔记4 -- 蜂鸣器控制
  9. 计算机毕业设计Java医院信息管理系统(系统+源码+mysql数据库+Lw文档)
  10. 跟我一起学习VIM - vim插件合集
  11. 银行招聘计算机考试时间,五大银行招聘考试时间是什么时候?
  12. scl语言用plc脉冲做定时器_scl语言用plc脉冲做定时器_西门子PLC SCL语言开发学习笔记(二)...
  13. c#之List深度复制
  14. Flink报错:exceeded checkpoint tolerable failure threshould
  15. 联想服务器如何修改硬盘模式,联想thinkpad如何修改硬盘模式为ahci
  16. 学会这几点,不懂代码也能做出炫酷可视化大屏!
  17. python中变量名_python中变量的命名及详解
  18. 均值定理最大值最小值公式_求函数最值问题复杂难算,只要用对方法,考试得分不用愁...
  19. 存储ic载板_ic载板的定义
  20. 6月书讯:最受欢迎的SQL入门书重磅升级

热门文章

  1. 【转】Linux之printf命令
  2. noip2002提高组题解
  3. 阅读作业二-----读Lost in CatB有感 by 李栋
  4. DELL服务器常见报错信息
  5. 解决ubuntu中zabbix 4.2图形显示乱码
  6. cmd-bat批处理命令延时方法
  7. bat执行时,跳转到当前bat文件所在盘符的根目录下面
  8. 【Shell】数值比较参数
  9. 网络管理与维护作业5
  10. iOS10 Safari不识别viewport禁用缩放的暴力解决方案