本文中的代码资源(即“附件”)下载地址:
链接: /s/1Ci85MrtVHKVkxpGDYz2dXw
提取码: cueq
上一篇文章:InsaneGuy:Meshlab编写自定义插件(上) -- 源代码编译
2 添加自定义插件
MeshLab中主要插件类型有 filter plugins, i/o plugins, edit plugins,这里只介绍如何添加 filter plugins。
下面这个链接是官方给出的例子:
Meshlab Development
简单来说就是 MeshLab 提供了 MeshFilterInterface 这个接口,我们只需要继承这个接口实现自己的类即可。
附件中的 “random_displacement.zip” 实现了一个让每个 vertex 产生随机位移的插件,具体代码如下:
// random_displacement.h#ifndef RANDOM_DISPLACEMENT_H#define RANDOM_DISPLACEMENT_H#include <common/interfaces.h>class RandomDisplacementPlugin : public QObject, public MeshFilterInterface{Q_OBJECTMESHLAB_PLUGIN_IID_EXPORTER(MESH_FILTER_INTERFACE_IID)Q_INTERFACES(MeshFilterInterface)public:enum {FP_MOVE_VERTEX };RandomDisplacementPlugin();virtual QString pluginName(void) const {return "RandomDisplacementPlugin"; }QString filterName(FilterIDType filter) const;QString filterInfo(FilterIDType filter) const;void initParameterSet(QAction *, MeshModel &/*m*/, RichParameterSet & /*parent*/);bool applyFilter(QAction *filter, MeshDocument &md, RichParameterSet & /*parent*/, vcg::CallBackPos * cb);int postCondition(QAction*) const {return MeshModel::MM_VERTCOORD | MeshModel::MM_FACENORMAL | MeshModel::MM_VERTNORMAL;};FilterClass getClass(QAction *a);};#endif
重点是要实现 `applyFilter()` 这个方法:
// random_displacement.cpp// The Real Core Function doing the actual mesh processing.// Move Vertex of a random quantitybool RandomDisplacementPlugin::applyFilter(QAction *filter,MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb){CMeshO &m = md.mm()->cm;srand(time(NULL));const float max_displacement = par.getAbsPerc("Displacement");for (unsigned int i = 0; i < m.vert.size(); i++) {// Typical usage of the callback for showing a nice progress bar in the bottom. // First parameter is a 0..100 number indicating percentage of completion, the second is an info string.cb(100 * i / m.vert.size(), "Randomly Displacing...");float rndax = (float(2.0f*rand()) / RAND_MAX - 1.0f) *max_displacement;float rnday = (float(2.0f*rand()) / RAND_MAX - 1.0f) *max_displacement;float rndaz = (float(2.0f*rand()) / RAND_MAX - 1.0f) *max_displacement;m.vert[i].P() += vcg::Point3f(rndax, rnday, rndaz);}// Log function dump textual info in the lower part of the MeshLab screen. Log("Successfully displaced %i vertices", m.vn);// to access to the parameters of the filter dialog simply use the getXXXX function of the FilterParameter Classif (par.getBool("UpdateNormals"))vcg::tri::UpdateNormal<CMeshO>::PerVertexNormalizedPerFace(m);vcg::tri::UpdateBounding<CMeshO>::Box(m);return true;}
把附件中的 “random_displacement.zip” 解压到 meshlab/src/my_plugins 下面:(my_plugins 文件 夹自己创建一个空的即可)
用 VS 打开 “meshlab_dev.sln”(之前由 meshlab_dev.pro 转换而来),利用 Qt5 插件打开 刚才 “meshlab/src/my_plugins/random_displacement” 中的 “random_displacement.pro” 文件:
打开后侧边栏多出了一个“random_displacement”子项目:
右键点击该子项目,选择“Properties”,在 “C/C++ -- Preprocessor -- Preprocessor Definitions” 中加入 “_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS” :
然后在 “Linker -- Input -- Additional Dependencies”中添加 glu32.lib 和 opengl32.lib:
右键点击“random_displacement”,选择“Build”,成功后在 meshlab/src/distrib 下打开 meshlab.exe 文件,此时 “Filters”菜单下多了我们刚才添加的插件功能项:
打开一个三维网格模型,处理前后分别如下图所示:
3 添加 PCL 插件
附件里还有两个插件:
- transformation_sample_plugin : 一个将三维模型绕坐标轴进行旋转变换的插件,没有 PCL 的内容,可以参考代码看看旋转是如何实现的
- pcl_icp_plugin : 一个利用 PCL 中的 ICP 算法将两个三维模型进行配准的例子
关于 PCL 的配置:
- 安装 PCL-1.8.0-AllInOne-msvc-win64.exe
- 检查系统环境变量里的 PCL_ROOT 是否为安装 PCL 的路径
- 在系统环境变量的 PATH 变量里加入如下内容
%PCL_ROOT%bin;%PCL_ROOT%3rdPartyFLANNbin;%PCL_ROOT%3rdPartyVTKbin;%PCL_R OOT%Qhullbin;%PCL_ROOT%3rdPartyOpenNI2Tools;
插件的添加同之前一样,利用 VS 的 Qt 插件打开相应的 .pro 文件。
注意:
- 要在每个子项目的 Properties 的 “C/C++ -- Preprocessor -- Preprocessor Definitions” 中加 入“_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”。
- 要在每个子项目的 Properties 的 “Linker -- Input -- Additional Dependencies”中添加 glu32.lib 和 opengl32.lib
- pcl_icp_plugin 这个插件里的 .pro 文件中,我链接的是 release 版本的库,注释里有标明, 可以改成链接 debug 版本的库,但是处理速度会比较慢。如果使用 release 版本,之前的 external 项目和 meshlab_dev.pro 项目都要重新编译一次 release 的版本,在 VS 中可以切换:
参考资料:
/fightingbull/article/details/8103463
MeshLab中插件的添加过程 - NobodyZhou - 博客园