转载自http://blog.csdn.net/jz_x/article/details/55002976
Meshlab源码初探
作者:徐景周
一、概述
Open GL是一种底层渲染3D图像的编程接口。任何实心3D几何体无非是将顶点间的点连接起来,然后对三角形进行光栅化而使对象变得有实体,计算机场景渲染无非是灵活运用变换、着色、纹理与混合四种技术。使用顶点和线段创建的图形仅是一些线条,不能填充任何颜色。为了绘制实体表面,我们需要的不仅仅是点和线,还需要多边形。多边形是一个封闭的图形,它可以用颜色或纹理数据进行填充,最简单实用的多边形就是三角形了。默认情况下,OpenGL认为具有逆时针方向环绕的多边形是正面,顺时针环绕的多边形是背面。
MeshLab 是一个开源的、便携式的、开扩展的系统,用于处理和编辑非结构化的三角网格。这个系统的目的是对在 3D 扫描生成的的非结构模型处理时起到帮助,提供一组工具用于编辑、清理、修复、检查、渲染和转换这种格式的网格。 Meshlab 和 VCGlib 都是意大利国立研究院的作品。
二、软件环境
2.1 VS2010
2.2 Meshlab 1.3.3
2.3 QT 5.2.1 (建议安装到D盘,目录默认。如:D:\Qt\Qt5.2.1)
2.4 QT VS Add-in 1.2.3
三、 注意事项
3.1 源码编译
http://wenku.baidu.com/link?url=AJ0j28wFNoXiOhWcoHaLP6W7Uxgapjy6IXut73eR1o6omACaQK8q6Z3mCb1moDnL9Dp9-jCGn5-QSWFxPi5y3lHd3gOZlxSpJwxCk9wAckO
3.2 filter_csg插件源码中,引用了源码中没有的第三方库。例如:mpir.lib
3.3 decorate_background插件源码中,图片丢失:”/textures/cubemaps/uffizi.jpg”.
3.4 filter_clean插件源码中存在着文件,依赖于另一个插件源码:edit_pickpoints.
3.5 通过vcg::CallBackPos等函数,可在MeshLab和VCGLab间回调。
四、 源码分析
4.1 meshlab
主目录。采用QT开发的的网格处理系统,它的核心使用了vcglib。
下面是meshlab主要的源码目录结构:
4.1.1 common
基础文件目录。主要包括插件参数/脚本解析,插件接口定义,插件管理,mesh管理基类等。
4.1.2 external
第三方源码库目录。因为vcglib和meshlab中文件会使用到它们,所以在编译meshlab工程时,需先编译这个目录中工程(将生成lib文件复制到distrib目录),编译细节可参见注意事项一节。
例如:
- lib3ds-xx
Autodesk 3D Studio文件C语言库.
- muparser_xx
Fast mathematical expressions parser library.
- OpenCTM-xx
Library for compression of 3D triangle meshes.
- bzip2-xx
File compression program that uses the Burrows–Wheeler algorithm.
- jhead-xx
Extract and manipulate JPEG EXIFinformation of photos.
- levmar-xx
The Levenberg-Marquardt algorithm is an iterative technique that finds a local minimum ofa function that is expressed as the sum of squares of nonlinear functions. 通用的非线性最小二乘算法库.
- structuresynth-xx
Structure Synthgenerates 3D structures by specifying a design grammar.
- glew-xx
The OpenGL Extension Wrangler Library.
- qhull -xx
Qhullcomputes the convex hull, Delaunay triangulation, Voronoi diagram, halfspaceintersection about a point, furthest-site Delaunay triangulation, andfurthest-site Voronoi diagram. It runs in 2-d, 3-d, 4-d, and higher dimensions. 研究解决凸包问题 .
4.1.3 meshlabplugins
插件目录。 meshlab中插件的加载有二种方式:一种是遍历插件目录中的dll文件,进行加载。另一种是遍历插件目录中的xml文件(例如:filter_measure.xml),通过判断是否存在与xml文件同名的dll文件和xml文件中是否包含JavaScript,进行不同方式的加载。其中,插件中的对话框等UI部分,都是通过MeshlabStdDialog和MeshLabXMLStdDialog二个类生成的。
MeshLab对其功能的扩展是通过插件来实现的,通过实现不同的接口,可以将插件放在不同的菜单下或工具栏上。例如:MeshFilterInterface接口,用于实现Filter菜单下的插件。
例如:
- filter_meshing
Mesh网格处理:缩放、移动、旋转,细分面,删除重复顶点等。
- filter_select
提供多种选择和删除方式。
- filter_layer
Mesh层操作。例如:删除/复制/重命名Mesh层、合并Mesh层等。
- io_base
导入/导出一些3D文件。例如:STL,PLY, OBJ等。
- decorate_base
绘制坐标轴、顶点、边角、边框、网格、标签、特征柱状图等。
- edit_manipulators
鼠标和键盘键进行操作:缩放、平移和旋转。
- edit_align
Mesh间拼接。
- edit_hole
Mesh中补洞。
- edit_measure
Mesh中测量选定距离。
- render_gdp
着色器:遍历加载与处理.gdp文件。
- render_rfx
着色器:遍历加载与处理.rfx文件。
4.1.4 sampleplugins
扩展插件示例源码的目录。
4.1.5 meshlab
主程序目录。例如:程序入口(MainWindow的实现,分别在mainwindow_RunTime和mainwindow_Init文件中),以及各种Actions(Render部分的生成,在rendermodeactions文件中)、Menus、Toolbars、Dialog逻辑等。
4.1.6 meshlabserver
批量处理工具目录,减少手工工作量。采用meshlabserver(命令行方式) +mlx文件(filterscript)的方式,可以自动化Meshlab工作。
4.1.7 distrib
发布目录,编译后生成的文件存放在此。
4.2 vcglib
meshlab的核心库。
下面是vcglib主要的源码目录结构:
4.2.1 vcg
整个库的核心,定义了所有的算法和数据结构。
4.2.2 wrap
包含一些针对特定需求/上下文/库的VCG概念的封装。例如:很多格式的网格数据的导入和导出,用OpenGL渲染三角形网格的代码等。
4.2.3 eigenLib
线性代数库,VCGLib中的高级矩阵操作基于这个库。
vcglib采用标准C++开发,封装了IO,OpenGL等功能。核心功能如下:
- 提供 Mesh(triangular mesh,tetrahedral mesh,三角网格或四面体网格)数据结构的定义,该数据结构支持对 Mesh数据的快速访问(拓扑信息、空间查询等)以及高效执行网格上算法。
- 在 Mesh数据结构基础上,实现大量高效的网格算法,如网格修补、平滑、变形、曲率计算、细分、泊松盘采样、等值面计算等。
- IO 支持,读写 PLY、OBJ、STL、3DS、OFF、DXF等格式网格文件。
- UI 支持,如 OpenGL网格显示,Trackball交互等。
五、架构
框架图
用例图
插件类图
启动事件图
参考文献
1. 源码编译, http://wenku.baidu.com/link?url=AJ0j28wFNoXiOhWcoHaLP6W7Uxgapjy6IXut73eR1o6omACaQK8q6Z3mCb1moDnL9Dp9-jCGn5-QSWFxPi5y3lHd3gOZlxSpJwxCk9wAckO