很久没有写博客了,前段时间由于工作需要切换到做遥感影像渲染与处理,关于遥感影像渲染与处理会继如果有机会再单独写。三维渲染并非自己本专业 ,当然对一个程序员而言无所谓专业或非专业,有的只是数据处理。本文只针对三维点云、三面片渲染而言,主要显示与处理三维扫描仪点云数据。对一些常用功能的制作与自己制作过程中遇到的问题进行说明。

在点云的渲染中本人接触到的开源三维渲染引擎有OSG,MeshLab,PointCloud,对于开源的三维渲染引擎最大的弊端是难以控制,对一些交互不友好的功能难以改动。上述开源三维渲染引擎中操作器不能做到定点缩放,即缩放前后鼠标所指的物体位置发生了改变。这与商业渲染引擎在交互体验上拉开了相当大的差距。以OSG为例其放大缩小是改变视图矩阵来实现缩放。因而其会受opengl显示维度的限制,由于其平移同样使用更改视图矩阵导致其无法实现定点缩放。本人曾经尝试过修正,很遗憾没能成功(也有可能是对其理解不深入)。在三维点云处理中使用最多的是GeoMagic,其交互流畅友好,因此其是一个很好的参照。

先上张图

云渲染架构图 云渲染引擎_渲染引擎

下面具体说几个通用需求的制作:

(1)对点云正反面不同的着色。

上述几个开源渲染引擎中都未提供该功能,当然可以自己手动实现。opengl中提供了三角面片的正反面着色的函数没有点云的。点云的正反面着色通过自定义shader进行,要进行正反面着色就需要法线。在glsl中,通过传入的法线与光心的夹角判断其朝向然后使用不同的颜色。三角网格的正反面着色同理。

(2)着色模式

flat或者smooth在shader中设定。

(3)三维坐标绘制

A、先绘制中心点(其实质是一个球)。

B、再绘制三个轴,三个轴其实现是一个圆柱,通过矩阵进行旋转得到三个不同的方向。

C、箭头,其实质是一个圆锥挂在圆柱上。

D、x、y、z使用了gltext库进行绘制。

把场景中的旋转矩阵传给当前三维坐标轴即实现了三维坐标的显示。本例绘制过程使用了glut进行球、圆柱及圆锥,使用显示列表进行调用 。需要另外设置视图与投影矩阵,投影矩阵采用平行投影。

(4)视图矩阵的设定

对于视图矩阵的设定可以参考OSG的设定方式,其基础类型的定义也可以参考OSG,本示例基础数据结构皆参考OSG。

(5)vao与vbo

两都可以把数据刷到显存中,只是vao需要计录偏移量,为了操作上的方便推荐尽量使用vbo。

(6)背景

本例背景就是一个(-1,1)的GL_QUADS然后贴了一张图。需要另外设置视图与投影矩阵,投影矩阵采用平行投影。

(7)关于Geomagic中顶视图、底视图、左视图、右视图、前视图、后视图、等视图

对于这几种视图其实质是改变视图矩阵中的lookup,即相机的摆放,正着摆,侧着摆,侧着摆等。

(8)透视投影与平行投影切换

可以参考osg中矩阵定义中透视投影与平行投影的计算,然后就可以自由切换。

(9)轨迹球

轨迹球 用以显示当前旋转方向与角度,与旋转中心相关。本例提供了包围球 中心,固定中心与动态中心三种及三种中心的自由切换,与GeoMagic一致。这个比较费事,后面有机会单独说明原理 。

(10)点云或者三角面片选择

主要涉及两个问题:

A、套索的绘制

套索需要永远显示在物体最上面,常规的通过屏幕点转世界坐标后绘制,当视图矩阵发生改变时,套索会出现有些地方不显示或者被物体遮挡。无论怎么设置depthfunc或者depthrange都不能解决上述现象,其原因在于屏幕转世界时的点,由于深度的原因被干掉了,所以不会永远显示或显示总显示物体上方。其解决办法是把投影切换到平行投影后,把远近调整到(-1,1)直接把屏幕坐标转到opengl坐标下绘制就OK了。套索下图红色。

云渲染架构图 云渲染引擎_点云_02

B、不同状态点云不同颜色的显示

需要注意的是由于采用glsl,本人暂时没有找到把标记传到glsl中的方法,貌似glsl不支持额外的属性设置。因此只能多次绘制,以达到该效果。

(11)网格绘制 出点,线、面三种状态

一次绘制不能同时显示三种 ,需要多次绘制。

差不多就这么多吧,可能说的比较模糊,只是当遇到具体问题时再看这些个就比较明了了。