Meshlab源码初探

Meshlab源码初探

作者:徐景周

 

一、概述

      MeshLab是一个开源的、便携式的、开扩展的系统,用于处理和编辑非结构化的三角网格。这个系统的目的是对在3D扫描生成的的非结构模型处理时起到帮助,提供一组工具用于编辑、清理、修复、检查、渲染和转换这种格式的网格。MeshlabVCGlib都是意大利国立研究院的作品。

 

二、软件环境

  •  VS2010
  •  Meshlab 1.3.3 
            下载: https://sourceforge.net/projects/meshlab/files/meshlab/

  • QT 5.2.1 (建议安装到D盘,目录默认。如:D:\Qt\Qt5.2.1)
  • QT VS Add-in 1.2.3

           下载: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

      第三方源码库目录。因为vcglibmeshlab中文件会使用到它们,所以在编译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.通用的非线性最小二乘算法.

  • 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部分,都是通过MeshlabStdDialogMeshLabXMLStdDialog二个类生成的。


      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_RunTimemainwindow_Init文件中),以及各种Actions(Render部分的生成,在rendermodeactions文件中)MenusToolbarsDialog逻辑等。

 

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++开发,封装了IOOpenGL等功能。核心功能如下:

  • 提供 Meshtriangular meshtetrahedral mesh,三角网格或四面体网格)数据结构的定义,该数据结构支持对 Mesh数据的快速访问(拓扑信息、空间查询等)以及高效执行网格上算法;
  • Mesh数据结构基础上,实现大量高效的网格算法,如网格修补、平滑、变形、曲率计算、细分、泊松盘采样、等值面计算等;
  •  IO支持,读写 PLYOBJSTL3DSOFFDXF等格式网格文件;
  • UI 支持,如 OpenGL网格显示,Trackball交互等。

 

五、架构

Meshlab源码初探_第1张图片

框架图

 

Meshlab源码初探_第2张图片

用例图

 

Meshlab源码初探_第3张图片

插件类图

 

Meshlab源码初探_第4张图片

启动事件图

 

你可能感兴趣的:(Meshlab源码初探)