本文中的代码资源(即“附件”)下载地址:

链接: https://pan.baidu.com/s/1Ci85MrtVHKVkxpGDYz2dXw

提取码: cueq

上一篇文章:InsaneGuy:Meshlab编写自定义插件(上) -- 源代码编译


2 添加自定义插件

MeshLab中主要插件类型有 filter plugins, i/o plugins, edit plugins,这里只介绍如何添加 filter plugins。

下面这个链接是官方给出的例子:

Meshlab Development​meshlab.sourceforge.net

简单来说就是 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 quantity
bool 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-msvc2015-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 中可以切换:


参考资料:

https://blog.csdn.net/fightingbull/article/details/8103463

MeshLab中插件的添加过程 - NobodyZhou - 博客园

插件properties_Meshlab编写自定义插件(下) -- 开发自定义插件相关推荐

  1. vsto下开发wps插件

    我们要开发wps插件了.之前用vsto开发过word插件,我也讲过c#下如何开发wps插件(有点繁琐).如果采用c#从头再开发wps插件,那么开发出来的office加载项就会出现两个.我们要实现的wp ...

  2. android自定义省略号,Android开发自定义TextView省略号样式的方法

    本文实例讲述了Android开发自定义TextView省略号样式的方法.分享给大家供大家参考,具体如下: 在布局xml中设置textView的字段 android:maxLines="2&q ...

  3. html下拉菜单插件,简单的jQuery大型下拉菜单插件

    booNavigation是一款简单的jQuery大型下拉菜单插件.通过该插件可以制作3列大型下拉菜单,并带有平滑过渡效果,以及鼠标滑过菜单项时的动画效果. 使用方法 在页面中引入jquery和boo ...

  4. word2007插件开发经验备忘1--如何开发word插件

    最近做了word2007的插件开发(VBA开发).虽然还没有完全写完,但是感觉有必要写一些东西了,于是就记录下来.... office的开发分为程序级开发和文档级开发,程序集开发的典型代表就是传说中的 ...

  5. Chrome 插件:无痕浏览模式下加载插件、启用插件设置方法

    通过 chrome://extensions/ 进入 chrome 插件列表,进入插件的详细信息页. 在无痕模式下启用的开关勾选上. 然后就好了. 喜欢的点个赞❤吧!

  6. Photoshop插件-锐化-高反差保留仅边缘-脚本开发-PS插件

    文章目录 1.插件界面 2.关键代码 3.代码转执行 4.作者答疑   PS是一款栅格图像编辑软件,模块众多.提供了脚本,动态连接库等多种扩展机制,本文演示如何通过脚本实现高反差保留仅边缘相关功能,展 ...

  7. Photoshop插件-锐化-局部选区锐化-脚本开发-PS插件

    文章目录 1.插件界面 2.关键代码 3.代码转执行 4.作者答疑   PS是一款栅格图像编辑软件,模块众多.提供了脚本,动态连接库等多种扩展机制,本文演示如何通过脚本实现局部选区锐化相关功能,展示从 ...

  8. 遨博协作机器人ROS开发 - 自定义运动学求解器算法插件

    目录 一.简介 二.环境版本 三.学习目标 四.知识储备 五.任务实施 六.任务拓展 七.课堂小结 八.课后练习 一.简介 大家好,欢迎关注遨博学院带来的系列技术分享文章(协作机器人ROS开发),今天 ...

  9. jQuery自定义漂亮的下拉框插件8种效果演示

    原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示  在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="en& ...

最新文章

  1. 13岁小孩都跟我抢Python了,完了!
  2. OpenCV中SurfDescriptorExtractor
  3. pycharm 如何搜索?Ctrl+N 搜索py文件 Ctrl+shift+N 搜索所有类型的文件 ctrl+shift+f 全局字符串搜索 ctrl+shift+a 配置项搜索 双shift全局
  4. 从python开始学编程pdf 解压密码_从Python开始学编程PDF高清完整版网盘免费分享...
  5. tg3269c网卡驱动linux,TP-Link3269C网卡驱动官方版
  6. Java基本数据类型的传值
  7. (继续搬)struts日期格式的转换以及hibernate中session的关闭在xml中的配置
  8. beetl html 转义,beetl 前端
  9. python主要功能_Python主要功能
  10. 深入解析 ES6 系列(二)
  11. CentOS安装Xampp环境
  12. vs2010 “SetScrollSizes”: 找不到标识符
  13. 初识Python必看基础知识~ 续(6)九层之台,起于垒土,肝肝肝~
  14. 如何阅读看懂datasheet
  15. MySQL查询行记录关键字_MySQL数据库~~~~~查询行(文件的内容)
  16. php开启子进程处理
  17. 机器学习——监督学习(一)
  18. Android系统升级
  19. Java基础语法小结
  20. C++:实现量化Integration积分测试实例

热门文章

  1. php相册cms,phpcms图片频道模板制作
  2. 想要提升英语阅读能力的小伙伴建议收藏!
  3. Linux C进程、线程
  4. ElementUI极简loading动画
  5. 前端实现在线预览文档
  6. 最新微信小程序反编译工具,完美解决分包问题
  7. 成都市2016年11月滴滴订单od数据
  8. SAP FI中配置“特别总帐标志” SGL
  9. java程序员的大数据之路(15):Pig Latin用户自定义函数
  10. java程序员的大数据之路(13):Pig入门