用osg显示点云,目前显示的所有点都是同一个颜色的,想优化一下视觉效果,由于每一个点都具有一个反射率参数,所以可以用这个参数为点上色。
还尝试过添加光照渲染,参考:https://zhuanlan.zhihu.com/p/38469643。光照渲染适合三维模型,用在点云上好像没什么意义。
点的颜色是通过geometry的setColorArry方法实现的,用四维向量Vec4填充进数组,和点的坐标数组一一对应。
ref_ptr<osg::Vec4Array> color = new Vec4Array();
color->push_back(osg::Vec4(0, 0, 10, 0));
ref_ptr<Geometry> geometry = new Geometry();
geometry->setColorArray(color.get());
osg::Vec4的四个参数分别代表R, G, B, A,A据说是透明度,但是测试了一下,点的透明度改变好像并不会改变显示效果。
目前已有的数据是每个点有一个范围是0-255的反射率参数fref,利用这个参数为点上色,将0-255的一维向量映射为RGB三维向量。
if (fref > 110)
color->push_back(osg::Vec4(fref - 108, 1, 1, 1));
else if (fref < 55)
color->push_back(osg::Vec4(1, 1, fref + 2, 1));
else
color->push_back(osg::Vec4(1,fref-53,1, 1));
和viewer的显示效果差不多。livox采用的上色策略:
https://github.com/Livox-SDK/Livox-SDK/wiki/Livox-Viewer#1-color-coding-strategy