Meshlab源码初探
作者:徐景周
一、概述
MeshLab是一个开源的、便携式的、开扩展的系统,用于处理和编辑非结构化的三角网格。这个系统的目的是对在3D扫描生成的的非结构模型处理时起到帮助,提供一组工具用于编辑、清理、修复、检查、渲染和转换这种格式的网格。Meshlab和VCGlib都是意大利国立研究院的作品。
二、软件环境
下载:https://www.qt.io/download-open-source/
三、 注意事项
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.
四、 源码分析
4.1 meshlab
主目录。采用QT开发的的网格处理系统,它的核心使用了vcglib。下面是meshlab主要的源码目录结构:
4.1.1 common
基础文件目录。主要包括插件参数/脚本解析,插件接口定义,插件管理,mesh管理基类等。
4.1.2 external
第三方源码库目录。因为vcglib和meshlab中文件会使用到它们,所以在编译meshlab工程时,需先编译这个目录中工程(将生成lib文件复制到distrib目录),编译细节可参见注意事顶段落。
例如:
Autodesk 3D Studio文件C语言库.
Fast mathematical expressions parser library.
Library for compression of 3D triangle meshes.
File compression program that uses the Burrows–Wheeler algorithm.
Extract and manipulate JPEG EXIFinformation of photos.
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.通用的非线性最小二乘算法库.
The OpenGL Extension Wrangler Library.
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菜单下的插件。
例如:
Mesh网格处理:缩放、移动、旋转,细分面,删除重复顶点等。
提供多种选择和删除方式。
Mesh层操作。例如:删除/复制/重命名Mesh层、合并Mesh层等。
导入/导出一些3D文件。例如:STL,PLY, OBJ等。
绘制坐标轴、顶点、边角、边框、网格、标签、特征柱状图等。
鼠标和键盘键进行操作:缩放、平移和旋转。
Mesh拼接。
Mesh补洞。
测量Mesh中选定距离。
着色器:遍历加载与处理.gdp文件。
着色器:遍历加载与处理.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等功能。核心功能如下:
五、架构
框架图
用例图
插件类图
启动事件图