使用Potree渲染大规模点云-踩坑记录
最近在研究点云渲染 想自己在本地搭建环境跑起来玩玩,不料坑真是多。花了我三天时间折腾,快要放弃的时候,终于搞好了。中间真是走了不少弯路,先是在mac上跑没成功,觉得是因为环境问题,又去折腾虚拟机,用别人构建好的docker也没成功。编译总是出各种错,改c++源代码,功夫不负有心人,终于搞好了。
---------------- 2020年12月15日更新docker镜像--------------------------
鉴于有很多小伙伴在搭建环境时,总是遇到各种各样的问题 ,我觉得很浪费时间。 为此我制作了一个docker镜像,免去搭建环境的烦恼。
确保本地装有docker环境
docker pull zt123123/potree-convert-ubuntu:latest
运行容器后,可直接执行PotreeConverter命令
此命令已经软连接到全局环境了
如果你不想踩坑,直接用镜像就好了,可以不用往下看了.......
---------------- 正文开始----------------
//Potree 介绍
//开源初探
//依赖的三方库
//PotreeConverter 安装过程
linux / gcc 4.9
//安装lastools
lastools (from fork with cmake)
cd ~/dev/workspaces/lastools
git clone https://github.com/m-schuetz/LAStools.git master
cd master/LASzip
mkdir build
cd build
//安装没有cmake要安装cmake
cmake -DCMAKE_BUILD_TYPE=Release ..//配置cmake
make
//安装PotreeConverter
PotreeConverter
cd ~/dev/workspaces/PotreeConverter
git clone https://github.com/potree/PotreeConverter.git master
cd master (这里有个坑,默认分支是develop, 记得切换成master,否则后续cmake 会提示没有cmake.list清单文件。我猜想这里可能是在开发当中,还没来得及加上。后续如果有的话,就不用切换分支了)
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLASZIP_INCLUDE_DIRS=~/dev/workspaces/lastools/master/LASzip/dll -DLASZIP_LIBRARY=~/dev/workspaces/lastools/master/LASzip/build/src/liblaszip.so ..
make
//这个步骤有几个坑:
//1.如果你是Mac OS 的电脑,你的电脑在编译lastools的时候,生成的文件叫liblaszip.dylib,而不是liblaszip.so,要不然会提示文件不存在
//2.cmake完成之后,进行到最后一步make的时候,会报一个致命错误
// fatal error: 'experimental/filesystem' file not found #260
//3. 路径要写成绝对路径(巨坑!!!)
~/dev/workspaces 替换成相应的 /Users/xxx/dev/workspaces
//google一把,最后发现在github的issues里面人家早就发现这个问题了,人家早就列出了这个问题,也是醉了
//问题出在如果我们cmake的时候不指定gcc的路径,那么,cmake默认使用将是苹果公司的gcc版本,里面会缺少这个库
//解决的办法
cmake -DCMAKE_C_COMPILER=/usr/local/Cellar/gcc/8.1.0/bin/gcc-8 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc/8.1.0/bin/g++-8 -DCMAKE_BUILD_TYPE=Release -DLASZIP_INCLUDE_DIRS=/Users/hejinlong/Desktop/LAStools/master/LASzip/dll -DLASZIP_LIBRARY=/Users/hejinlong/Desktop/LAStools/master/LASzip/build/src/liblaszip.dylib ..
//根据自己的gcc版本而定
4. 编译的时候可能还会遇到一个错误 ‘Potree::Point&’ from an rvalue of type ‘Potree::Point’ writer->write(reader->getPoint());
原谅我太菜 c++不是很熟, 不然这个问题一眼就能看出来 再次goole得以解决
解决办法如下
Potree::Point point = reader->getPoint();
writer->write(point);
上述办法我没试验成功,我用了另一种方式
我报的错并不是这个,而是filesystem缺失 反而有 experimental/filesystem
fatal error: 'filesystem' file not found
我直接魔改源代码 直接改成了 #include<experimental/filesystem>
记得同时改掉命名空间
namespace fs = std::experimental::filesystem;
//编译成功之后
./PotreeConverter -h //查看相关的参数
//此处还有一个隐藏坑
//我们明明编译好了PotreeConverter工具,但是会报这样的一个错,原因是我们的终端字符集编码的问题
// what(): locale::facet::_S_create_c_locale name not valid
export LC_ALL="zh_CN.GBK"
//实例:把las文件导出成为n个100kb大小的las文件
./PotreeConverter /Users/hejinlong/Desktop/las/a.las -o /Users/hejinlong/Desktop/las/change -p leida --output-format LAS
分割好las之后就可以导入potree项目使用
https://github.com/potree/potree
效果截图:(嘻嘻 小伙伴看出来这是哪里了吗)
最后还是不得不对于这次踩坑总觉一下
1. 遇到问题还是要耐心,坚持就是胜利
2. 遇到技术问题还是要多google
3. c++还是要再加强学习一下