
点云处理在Unity里一直是个有点小众但又绕不开的话题。这两年随着激光扫描、无人机航测、数字孪生项目越来越多经常能在社区里看到有人问“怎么把点云塞进Unity里渲染”。如果你也卡在这一步Pcx这个插件应该是你绕不开的一站。Pcx是日本开发者keijiro开源的PLY点云渲染方案全名Point Cloud Viewer Runtime Loader。它解决的核心问题很简单Unity本身不认点云格式但通过Pcx你可以把标准PLY文件直接导入工程然后在场景里用GPU实例化的方式渲染出百万级粒子点。我自己从2018年开始用这套工具中间在好几个项目里反复折腾过从无人机航测的稀疏点云到地面站扫描的高密点云都试过踩了不少坑也把它的源码翻了底朝天。这篇我用完整实操的方式把Pcx从安装、导入、渲染到动态加载的整套流程拆开讲一遍给准备选型或者正在被点云渲染折磨的朋友做个参考。1. 为什么Unity里做点云要选Pcx而不是自己造轮子1.1 Unity原生处理点云的三座大山直接说结论Unity默认情况下对点云的支持约等于零。你拖一个.ply文件进Project窗口Unity根本不认识这种格式不会生成任何可用的资源。很多第一次接触点云的人以为把文件拖进去就能看到点结果发现啥也没有然后在论坛里来回搜最后无奈地转向Mesh转换路线——把点云变成Mesh再渲染。这条路在点数量少的时候可行但点云动辄几十万上百万个点如果全转成Mesh顶点数直接爆炸构建Mesh的时间、内存占用和DrawCall全都吃不消。第二个痛点是渲染层的性能。点云本质上是海量独立顶点如果用传统MeshRenderer加一堆小Cube或者Quad来表现每个点场景一多就直接卡成幻灯片。一个十万点的点云光是生成十万个GameObject就能让编辑器卡死。即使退一步用Mesh合并顶点数据依然需要CPU端逐帧提交GPU的压力反而更大。第三个痛点是格式兼容性。点云数据源非常杂有LiDAR扫描仪导出的LAS/LAZ有摄影测量软件生成的PLY/OBJ有RGB-D相机算出来的PCD还有各种算法输出的自定义二进制。如果没有一个统一的手入手段每个项目都得写一套格式解析器工程量直接翻倍。1.2 Pcx的切入方式格式解析加GPU实例化Pcx选择了一条我认为非常聪明的路线它自己不碰复杂业务逻辑只专注两件事。第一件事是PLY格式的解析。Pcx内置了一个基于C#的PLY文件读取器支持ASCII和Binary两种编码方式能解析顶点位置、法线、颜色、强度等常见属性字段。导入的时候Unity会调用这个读取器把点云数据缓存成一个ScriptableObject资源相当于在Unity内部建立了一个“点云资产”的概念之后场景里的渲染组件只要引用这个资产就能工作。第二件事是渲染。Pcx使用GPU实例化Graphics.DrawMeshInstancedIndirect来绘制点云所有点数据一次性打包进ComputeBufferGPU端按需读取顶点属性逐点生成小方块或者圆点。这种方式下CPU每帧只需要提交一次绘制指令DrawCall基本恒定点数量增加带来的额外开销主要在GPU侧所以百万点级别的点云也能跑得比较流畅。我自己对比过市面上的替代品比如有些付费插件走的是EntSPointCloud管线功能更强但价格高、上手也重还有一些轻量方案只能离线烘焙点成Mesh完全牺牲了实时性。Pcx在开源免费、API简洁、性能达标这三者之间找到了平衡点对于绝大多数“把点云放到Unity里看”的需求来说它是性价比最高的选择。2. 环境准备Unity版本、渲染管线与安装方式2.1 Unity版本选择和渲染管线兼容性先解决一个实际问题你的Unity版本能不能用Pcx。我在2022.3 LTS和Unity 6上都跑过目前来看Pcx官方维护比较活跃对2021及以上版本的支持都很好。如果你还在用2019或者2020也能跑但需要留意C#版本兼容某些较新的API可能没法用处理方式可以稍后再说。更关键的是渲染管线的选择。Pcx默认的Shader同时支持内置管线Built-in Render Pipeline和URP如果你项目用的是HDRP情况要特别注意。HDRP下直接使用默认的Pcx材质会出问题比如点云显示不出来或者渲染出来是黑色。解决方法是导入Pcx之后手动把渲染管线切换成各自对应的Shader变体——Pcx在HDRP目录下带了一套专用Shader你得在材质面板里手动替换。URP其实也有这个问题如果你在URP项目里新建材质时默认选中的是Pcx/Point实际上URP下推荐的也是专用变体不换的话可能出现点大小不可调之类的现象。一个简单的判定标准如果你新建项目时选了“3D (Built-in Render Pipeline)”模板Pcx开箱即用什么都不用管如果你用的是URP或HDRP模板导入Pcx后记得检查一下Shader设置。2.2 从Git URL安装Pcx插件Pcx的安装方式有几种我比较推荐用UPMUnity Package Manager的Git URL方式安装因为它能自动拉取依赖而且后续更新方便。打开Unity后进入Window菜单下的Package Manager点击左上角的加号选择“Add package from git URL...”然后输入https://github.com/keijiro/Pcx.git?pathAssets/Pcx这里有一点要注意加号弹窗里输入的不是仓库根地址而是要指向Assets/Pcx子目录因为Pcx仓库里还有测试工程和其他资源只有Assets/Pcx才是真正的Package主体。如果你直接把根地址填进去UPM会提示找不到package.json这是新手最常见的一个安装失败原因。另一个选择是通过OpenUPM安装如果你装了openupm-cli在项目根目录运行openupm add jp.keijiro.pcx就能完成安装这种方式的好处是直接写进manifest.json项目的可复现性更好。安装完成后Project窗口的Packages目录下会出现Pcx这个包展开后大概能看到Runtime、Editor、Shaders等几个子目录。能够看到这些目录就说明安装成功了。2.3 验证安装先跑一个自带示例Pcx包内带了一个非常小的示例位置在Packages/Pcx/Example/里面有一个预制体和配套的PLY文件。把Example场景打开直接播放你应该是能看到一个简单的点云形状的。如果这里都看不到东西那多半是渲染管线和Shader的问题先去排查上面说的兼容性这个示例就是最好的“体检报告”。我第一次装的时候就是在内置管线下直接跑出来的结果一切正常然后换到URP项目里又看不到点排查了很久才发现是Shader没有自动切换。所以建议你先在示例场景里跑通一次再往自己的业务场景里迁移。3. 点云文件的获取与PLY格式准备3.1 PLY格式到底长什么样Pcx只接受PLY格式的点云所以你要么手里本来就是PLY文件要么得先用其他工具转成PLY。理解一下PLY的结构能省去不少排查问题的时间。PLYPolygon File Format是一种存储三维网格和点云数据的文件格式文本格式下大概长这样ply format ascii 1.0 element vertex 6 property float x property float y property float z property uchar red property uchar green property uchar blue element face 0 property list uchar int vertex_indices end_header 0.1 0.2 0.3 255 0 0 0.2 0.2 0.3 0 255 0 ...最上面是Header声明了文件格式是ASCII还是二进制并且用property关键字定义了每个顶点的数据字段。最常用的字段是x、y、z三个坐标颜色字段一般是red、green、blueuchar类型。Pcx在导入时主要读取的就是这几个字段如果你的PLY文件里没有颜色数据比如纯坐标点云Pcx也能导入但渲染出来会是一片白色。二进制PLYformat binary_little_endian在解析上稍微复杂一点但文件体积更小读取速度更快所以大点云文件一般都用二进制格式存储。Pcx的导入器对这两种格式都支持不过如果你的文件是从某个专用扫描软件导出的字段顺序或者字节对齐可能不规范导入报错的话可以考虑先用CloudCompare过一遍重新导出成标准的PLY。3.2 用CloudCompare等工具导出标准PLY提到CloudCompare我多说几句。这是目前最主流的点云处理开源软件用来做格式转换、点云降采样、配准、分割都很方便。如果你手里是LAS或者其他专用格式流程一般是打开CloudCompare拖入源文件然后选中这个点云图层点击File菜单里的Save在保存类型里选PLY。这里有一个关键选项叫“Binary mode”默认是开启的。如果你希望得到纯文本PLY方便调试就取消勾选。我个人建议大文件都用二进制体积差好几倍。另外一个非常推荐的操作是降采样。比如你有一块LiDAR扫描的密集点云原始点数是5000万直接导入到Unity里会非常吃力。在CloudCompare里选中点云使用Tools Subsample工具选择“spatial subsampling”设置一个最小空间距离比如0.02米它能帮你快速把点数降到百万级以内而且空间特征保留得很好。这一步对后面的Unity渲染性能影响极大属于必做的预处理步骤。3.3 用Python快速生成一个测试PLY文件如果你手头暂时没有合适的点云文件又想知道Pcx能不能在你的环境下跑通最快的方法是用Python生成一个假点云。我写过一个简单的生成脚本几十行就能造出一个带颜色的螺旋形状点云。import struct point_count 100000 with open(test_points.ply, wb) as f: header fply format binary_little_endian 1.0 element vertex {point_count} property float x property float y property float z property uchar red property uchar green property uchar blue end_header f.write(header.encode(ascii)) for i in range(point_count): t i / point_count * 6.28 * 3 r 0.5 i * 0.0001 x r * 2.0 * (t / 6.28) * 0.1 y (i % 1000) / 1000.0 - 0.5 z r * 0.5 # 用颜色区分高度 red int(255 * (y 0.5)) green int(128) blue int(255 - red) # 二进制格式3个float 3个uchar f.write(struct.pack(fffBBB, x, y, z, red, green, blue))这个脚本生成的文件是二进制PLYPcx可以直接读取。你只要调整point_count就能控制点数从0.1到1亿都能模拟。把它放到Unity的Assets目录下Pcx会自动导入如果能看到一个彩色的立体形状说明你的整个链路已经通了。4. 导入和场景搭建从零开始把点云显示出来4.1 把PLY导入Unity工程Pcx安装成功之后Unity会注册一个PLY文件的导入器。你只要把.ply文件拖到Project窗口的Assets目录下Unity就会自动调用Pcx的导入逻辑生成对应的点云资产。导入完成之后你在Project窗口选中这个PLY文件Inspector面板能看到导入摘要包括点云顶点数和包围盒信息。如果没有显示这些信息说明导入器没有生效检查一下Pcx包是否真的安装到了当前项目里。接下来创建一个空物体在Inspector里点击Add Component搜索“Point Cloud Renderer”挂上这个组件。然后把刚才的PLY资产拖到组件的“Point Cloud”槽位上。这个时候如果场景视图没看到点不要急着改代码大概率是点太小或者相机裁剪平面的问题继续往下看参数调整。4.2 PointCloudRenderer核心参数逐项说明PointCloudRenderer这个组件是Pcx对外暴露的核心渲染接口它的参数不多但每一个都直接影响显示效果和性能我一个个说。Point Size这是点的大小单位是世界单位。默认值通常是0.01对于小范围点云来说可能刚刚好但对于一栋楼那么大的扫描点云0.01的点会小到看不见。我的经验是先看一眼包围盒大小再把Point Size调到包围盒对角线长度的千分之一到五百分之一左右。比如包围盒对角线是100米那Point Size取0.1到0.2比较合理。Color Mode这个参数决定点的颜色来源有RGB和Normals等选项。如果PLY里带颜色选RGB如果只有几何信息可以选Normals用伪彩色表现法线方向视觉上会清晰很多。Shadow Mode点云是否投射阴影。On的时候GPU实例化渲染会额外输出Shadow Pass性能消耗会翻倍而且点云本质上是离散点阴影边缘会有大量噪点观感并不好。我的建议是默认关掉除非你有明确的美术需求。Point ShapePcx提供两种点形状方形和圆形。方形性能略好圆形视觉效果更柔和。点云特别稀疏的时候用圆形会更自然密集的时候其实差别不大。Transform由于点云是一个整体资源你可以像操作普通物体一样对它做位移旋转缩放。但要注意的是对点云缩放会影响Point Size的实际显示效果因为GPU实例化是在物体空间里用Point Size乘以缩放系数的。如果你的点云出现了“点忽大忽小”的情况检查一下物体Scale是不是1。4.3 Shader的选择和材质配置Pcx自带的Shader有几种变体我实际项目里最常用的是Unlit和Standard两种。Unlit不受光照影响点云颜色就是原始顶点颜色适合做技术预览和快速查看Standard会受场景光照影响效果更真实但需要场景里有合适的光源否则点云可能看起来偏暗。顺便提一个常见的坑如果点云导入后材质是粉红色说明Shader不可用。最常见原因是渲染管线不对。在URP项目里你需要手动创建材质把Shader改成URP对应的着色器路径大概是“Pcx/Point Cloud (URP)”之类的。内置管线用默认的就行。有些版本的Pcx里Shader路径写的是“Pcx/Point”这个需要你在材质面板里能选到。如果没有可能你的包版本较老去GitHub仓库看看Release说明确认一下当前版本支持哪一种渲染管线。5. 运行时动态加载点云从静态资产到实时数据5.1 使用PointCloudLoader在运行时读取PLY如果你只是想在编辑器里摆一个静态点云看效果前面第4章的内容已经够用了。但真实项目里点云数据往往是动态生成的——比如无人机实时传回的点云、服务器端同步的点云文件或者程序化生成的地形采样点。这就要求我们能在运行时加载PLY文件而不是提前导入到Assets里。Pcx为此专门提供了一个接口组件叫PointCloudLoader。它的用法很简单在场景里挂一个PointCloudLoader在Inspector里指定一个PLY文件的路径相对于StreamingAssets目录然后调用Load()方法组件会把文件解析成点云数据并自动创建一个PointCloudRenderer来渲染。API大致长这样using UnityEngine; using Pcx; public class PointCloudLoaderExample : MonoBehaviour { public string plyFileName scan.ply; private PointCloudLoader _loader; void Start() { // 把PLY文件放在Assets/StreamingAssets/目录下 _loader GetComponentPointCloudLoader(); string path System.IO.Path.Combine(Application.streamingAssetsPath, plyFileName); _loader.path path; _loader.Load(); } void Update() { // 按空格键重新加载方便调试 if (Input.GetKeyDown(KeyCode.Space)) { _loader.Load(); } } }这里有个重要细节运行时加载的PLY文件不会被Unity的导入器加工它是直接用C#解析的。所以它的数据来源可以是动态生成的、从网上下载的、甚至是从内存中构造的字节数组只要有合法的PLY二进制流就能喂给Pcx。5.2 文件路径与平台兼容问题动态加载最容易出问题的就是路径。PC编辑器下Application.streamingAssetsPath路径很好理解但到了Android或者iOS上这个目录下的文件会被打包进APK/IPA里面不再是可写目录。如果你希望App能动态下载点云文件到本地再加载我建议先把它下载到Application.persistentDataPath然后PointCloudLoader的path属性指到那里。Pcx的PointCloudLoader在读取大文件时有一个性能特点——它是同步读取的。如果你加载一个200MB的PLY文件主线程会卡顿几秒钟。对实时性要求高的项目建议用异步方式比如开一个子线程解析然后在主线程里提交。Pcx源码里没有直接提供异步API但它的文件解析逻辑是纯C#理论上可以扔到Task里执行最后把结果做成PointCloudAsset再交回主线程。5.3 配合相机控制器做点云漫游点云加载出来之后接下来关心的是怎么交互查看。Pcx本身不提供相机控制功能但你可以用Unity自带的Cinemachine或者自己写一个简单的轨道相机脚本。我自己的习惯是写一个极简的FPS式相机通过WASD移动、鼠标右键旋转视角。点云的显示效果和相机近远裁剪平面关系很大特别是近距离查看时默认的Near Clip0.3米可能会导致近处点被裁掉看起来好像点云缺了一块。建议把相机的Clipping Planes的Near设成0.01或者更小Far设成至少覆盖点云包围盒的2倍距离。另外Pcx的GPU实例化是在URP的Forward路径下渲染的所以它天然支持雾效。如果场景里开了线性雾远处的点颜色会变化这在有些项目里是加分项有些项目里反而会显得脏看需求决定是否需要关闭。6. 性能优化与常见问题排查6.1 点云太大导致卡顿怎么办当点云数量超过几百万甚至上千万的时候即使有GPU实例化帧率也会明显下降。碰到这种情况我的第一反应是降采样而不是优化渲染代码。推荐的降采样方案有两种。一种是在数据源头处理用CloudCompare等工具做空间降采样把点数压到合理范围再导入。另一种是写运行时降采样比如在PointCloudLoader加载后直接丢弃一部分点这在展示型项目里很实用——比如你要演示一个亿级点云不一定每帧都显示全部点可以只取五分之一甚至十分之一。具体在Pcx里做运行时降采样的思路大概是加载完PointCloudAsset后根据原始顶点数据自己构造一个新的PointCloudAsset只保留抽样后的点。需要访问底层的顶点Buffer这个API可能比较复杂建议优先在数据端做降采样。6.2 点太小看不到、点太大糊成一片这个问题的根源是PointSize和相机距离的比例关系。点云不是连续的表面它是由离散点构成的Point Size设置不合适会直接影响可读性。经验公式Point Size大约等于点云平均点间距的2到4倍。如果点间距是0.01米那么Point Size取0.02到0.04就能看到清晰又不重叠的点。如果你不知道点间距是多少先从物体的包围盒对角线和点数量的三次方根估算一个平均间距再按上面的倍数调整。还有一种情况当你旋转视角时点云会出现闪烁或者大量空洞。这通常是点太小加上高频信息太密的组合问题。可以先试着一个点一个点地调整Point Size如果还不行检查一下Project Settings里的Quality设置把Anti Aliasing关掉试试某些曲线上的锯齿在点云里会表现得特别扎眼。6.3 材质变粉、显示不出点云的排查速查表我把实际项目中遇到最多的几个问题和排查思路整理成一个表格遇到类似情况可以按顺序检查。现象可能原因解决办法点云完全不显示相机裁剪平面太近/太远调整Camera的Clipping Planes点云完全不显示PointCloudRenderer没挂载点云资产把PLY资产拖到Point Cloud槽位点云完全不显示Shader不可用材质变粉检查渲染管线是否匹配手动替换Shader点云显示但全是白色PLY文件本身没有颜色字段用CloudCompare重新导出带颜色的PLY点云显示但颜色太暗场景缺乏有效光照用Unlit Shader或增加环境光点云卡顿严重点数量过多降采样或减小Point Size点云导入失败PLY文件过于特殊用CloudCompare重导出一份标准PLY点云动态加载失败路径错误或文件未放入StreamingAssets用Debug输出查看实际路径确认文件存在Android加载不出点云点云被打包进APK无法直接解析先拷贝到persistentDataPath再加载6.4 多个点云叠加时的性能与遮挡问题数字孪生项目里经常要同时显示多个点云文件比如不同时间扫描的两次结果需要叠加对比。Pcx本身支持多个PointCloudRenderer只要你创建多个物体各自挂组件就行。但此时要特别注意两个问题。一是DrawCall累加每个PointCloudRenderer会提交一次绘制指令如果叠加了20个点云DrawCall就到了20这还是能接受的。二是深度测试问题多个点云互相遮挡时由于点与点之间有缝隙远处点云的像素可能透过缝隙显示出来产生闪烁。解決办法是调整Point Size让点稍微大一点或者关掉后向面的深度写入。实际项目中我一般会让每个点云有点不同的颜色这样叠一起时视觉效果非常清晰。另一个容易踩的坑是多个点云的坐标基准不统一。不同扫描设备导出的点云可能采用不同的坐标系直接叠加会显示得很乱。这个需要先用CloudCompare做配准再导出成统一坐标系的PLY。UNITY侧一般不需要再做额外变换除非你有场地的特殊定位需求。6.5 Pcx与工程项目集成的经验教训最后分享几个从实际项目里总结出来的细节。版本管理上尽量直接用UPM的Git链接安装这样manifest.json里会保留确切的版本记录。团队协作时大家统一用同一个版本避免因为本地包差异导致Shader行为和导入结果不一致。点云文件尽量不要放在Assets目录下做版本管理因为二进制文件很容易撑爆Git仓库。把原始点云放在外部存储或者StreamingAssets中然后通过PointCloudLoader运行时加载这样既能保持Assets清爽也方便后续更新数据。如果你要在WebGL平台发布需要注意Pcx的GPU实例化在WebGL2下能不能跑取决于浏览器对ComputeBuffer的支持情况。我自己测试下来Chrome桌面版是可以用的但移动端浏览器兼容性差一些如果你要发布WebGL版本建议提早做一轮真机测试。关于点云颜色精度PLY里的颜色字段一般是uchar0-255但有些高端扫描设备会输出16位颜色深度。Pcx目前对内建颜色字段的解析是按uchar处理的如果你的PLY文件是16位颜色导入后颜色可能会出现条纹或者明显丢色这时候可以先用CloudCompare转换一次把颜色降为8位再导入。再补充一个关于法线的细节。法线字段在PLY里是可选的。如果你的点云需要做光照计算或者背面剔除必须确保PLY文件里包含法线数据。CloudCompare导出的PLY默认会带法线字段但某些自研脚本生成的PLY可能只有坐标和颜色。没有法线会怎样Pcx的Standard Shader在计算光照时会把缺失的法线当作零向量处理结果就是点云看起来全黑——这个问题非常隐蔽排查起来让人抓狂。一旦遇到点云是全黑的先检查PLY里有没有法线字段没有就重新导出。如果在项目里要频繁动态加载点云建议对PointCloudLoader做一层封装内置缓存机制文件名加修改时间做Key已经加载过的资产直接复用避免重复解析。这个在需要频繁切换场景或者数据更新的项目里能明显提升响应速度。还有个体验层面的细节Pcx渲染点云时默认不启用抗锯齿。百万级点云在视角快速移动时锯齿和摩尔纹会很明显。如果你不希望画面有太强的噪点感可以启用相机的Post Processing加一个很轻的Bloom或者Tonemapping能在视觉上有效柔化点云的边缘看起来更像一个连续表面。不过这属于锦上添花的手段性能消耗要自己评估。7. 实战案例把Pcx集成进一个简单的数字孪生原型前面理论部分很多了这个章节我用一个非常简化的实战过程把整个流程串一遍。假设我们要做一个室内扫描点云的数字孪生原型用手机或者手持LiDAR扫描仪扫出一个房间的PLY点云然后在Unity里用Pcx显示出来并能通过鼠标拖拽旋转查看。第一步数据准备。用扫描App导出点云一般能导出为PLY。如果软件只能输出E57或者LAS先经过CloudCompare转成PLY。扫描的时候注意光线的均匀性太暗的区域点云会稀疏甚至空洞影响最终展示。第二步Unity工程设置。新建一个3D工程选择内置管线模板。如果你公司统一用URP也可以但记得按照第2章说的检查Shader兼容性。安装Pcx用UPM的Git URL方式。创建一个空场景删除默认的平行光后面我们直接用Unlit Shader渲染点云不需要光照。第三步放置点云。把PLY文件拖入Assets目录等它导入完成后新建一个空物体挂上PointCloudRenderer把PLY资产拖上去。把Shader调成Unlit点大小调成间距的2到4倍。此时场景里应该能看到点云了。第四步写一个简单的观察相机脚本。新建一个C#脚本实现鼠标左键旋转、滚轮缩放以及右键拖拽平移。这里有一个小技巧缩放时同时调整相机ClippingPlanes的Far值保证远距离也能看清全部点云。相机始终看向点云的中心这样操作手感最好。第五步性能检查。调出Stats窗口看看每帧的DrawCall和三角面数。与原生的室内场景相比Pcx会多出1个DrawCall但点云数据本身的三角面数为0。如果你的项目要求帧率在60FPS以上这个场景运行起来毫无压力。这个原型做完之后后续可以扩展的地方就多了可以加载多块点云对比可以做点云和BIM模型的叠加可以在点云上摆放虚拟标注甚至可以接入实时扫描流。Pcx只是负责渲染层剩下的业务逻辑完全由你在外面搭建。8. 写在最后我的一些心得和后续玩法参考从第一次在Unity里看到百万点云流畅旋转到后来在几个商业项目里把点云当作底层数据承载Pcx给我的感受是“小而精准”。它没有堆砌复杂的编辑器工具没有试图做点云配准、分割这些重型功能而是把PLY导入和GPU实例化渲染这两件事打磨到极致。这种克制的设计思路反而让它在Unity生态里占据了不可替代的位置。如果你已经在用Pcx后续还可以试试它的几个扩展方向。一是和Pcx自带的PointCloudBaker配合把点云烘焙到Mesh表面做表面重建二是结合Unity的Raycast把鼠标点击命中最近的粒子点做点云上的距离测量三是把Pcx作为一种可视化基座接入自定义的点云处理算法从Web端拉取数据流实时渲染。这些进阶玩法等这篇基础教程消化完之后我们可以一个个展开聊。我到现在还记得第一次用Pcx渲染扫描点云时那种“原来Unity里也能这么流畅地看几百万个点”的惊喜。希望这篇教程也能帮你跨过那道坎少踩几个我当年踩过的坑。