开源库网格算法比较

2023-11-07

对于Mesh,我们通常分为结构化网格和非结构化网格。理解很简单,除了四边形和六面体是结构化网格,其它都是非结构化网格

最近在学习网格算法,本人关心的主要是3D网格相关的算法,总结了一下主要包括:网格生成,网格平滑,网格参数化,网格重新剖分,网格简化,网格修复,网格变形,其他算法(细分,布尔操作,偏置,抽壳,雕刻,曲面切割)等。

从开源的算法库入手,分别用了CGAL,VTK,MeshLab,GTS四个开源库的算法功能,先小小的做个总结。

CGAL,The Computational Geometry Algorithms Library(计算几何算法库)

官方的介绍:

CGAL是高效、可靠的C++几何算法库。CGAL可用于多个需要几何计算的领域,例如地理信息系统(GIS),计算机辅助设计(CAD),分子生物学,医学影像,计算机图形学和机器人学。

该算法库提供几何相关的数据结构和算法,例如三角网格化,Voronoi图,多边形和多面体的布尔运算,点集处理,曲面整理,曲面网格和体积网格生成,几何处理,Alpha形状,凸壳算法,KD树等。

在CGAL4.9的手册里面可以了解到,CGAL包含:

算数和代数计算

组合算法(矩阵的单调排序,线性和二次方程求解)

几何内核(2D,3D和dD)

凸壳算法(2D,3D和dD)

多边形(2D多边形,2D多边形布尔操作,2D多边形分解,二维多边形Minkowski和,2D线段简化,2D可视化计算)

复合单元和多面体(3D多面体面,半边数据结构,曲面网格,复合映射,线性复合单元,多面体3D布尔操作,多面体凸壳分解,多面体3DMinkowski和)

曲线整理(2D整理,2D曲线交点,2D快速近似,2D包络线,3D包络面)

三角剖分和Delaunay剖分(2D剖分,2D剖分数据结构,2D周期剖分,3D剖分,3D剖分数据结构,ND剖分,2D Alpha形状,3D Alpha形状)

Voronoi图(2D分割Delaunay图,L无限分割Delaunay图,2D Apollonius图,2DVoronoi图适配器)

网格生成(2D整合剖分和网格,3D曲面网格生成,3D表面曲面网格化,3D网格生成)

形状重建(泊松曲面重建,尺度空间曲面重建,高级点集曲面重建,优化传输曲面重建)

几何处理(多边形网格处理,3D曲面细分方法,三角化曲面网格分割,三角化曲面网格简化,三角化曲面网格变形,三角化曲面网格参数化,三角化曲面网格最短路径,三角化曲面网格骨架,三角化曲面网格的脊和中心,采样点曲面的局部微分特性的估计,点集的处理,点集形状检测,2D流线分布)

空间搜索和排序(2D最近邻搜索,区间空间隔列表,dD空间搜索,dD分割树,dD同向盒的相交序列,3D快速相交和距离计算,空间排序)

几何优化(体积包围盒,内切区域,优化距离,PCA)

插值(2D曲面函数插值,广义质心坐标)

运动数据结构(运动数据结构,运动框架)

支持库(STL扩展,Boost图形库,求解器(Solvers),Boost属性映射,Cone-Based Spanners,Handles and Circulators,几何对象生成器,分析工具和hash映射,IO流)

可视化(Geomview,Qt图形可视化框架,CGAL Ipelets)。

从CGAL官方手册提供的功能可以看出,CGAL能够提供网格生成,网格剖分,网格简化,网格变形,网格布尔运算,网格曲面参数化的功能,但是缺少网格修复的功能(可能有,但是本人没有发现)。

GTS,the GNU Triangulated Surface Library(GNU三角网格化曲面库)

官方介绍:

GTS表示the GNU Triangulated Surface Library,它提供一系列开源、有用的函数,用于处理包含连接三角面片的3D曲面网格。

它的代码是基于面向对象的方法用C实现的。需要注意的是,GTS最初的目的是为科研人员提供简单高效的处理3D曲面网格的函数库。

该算法库的主要特点:

简单的面向对象的数据结构,快速获取拓扑特性

2D动态Delaunay剖分和约束Delaunay剖分

稳定的几何预测用于快速自适应浮点计算

稳定的曲面布尔操作

曲面修复和简化

基于视角的动态连续LOD

基于视角LOD的预处理

包围盒树和KD树,用于高效点的定位和交点检测

图操作:图的遍历和分解

矩阵计算

快速生成三角面

从官方提供的信息可以看出,GTS能够提供网格简化,三角面片剖分,3D曲面网格的布尔运算,网格修复的处理,但是功能都相对较为简单,不能处理复杂的网格和体数据网格。

另外需要注意的是,GTS是为GNU开发的,基本数据结构是基于Glib,这就使得在windows平台下编译和使用非常困难,所以不推荐使用。

VTK,Visualization toolkit(可视化工具)

官方介绍:

VTK是开源免费的软件系统,可用于3D计算机图形学,图像处理和可视化。VTK包含C++类库和一些集成接口层,如Tcl/Tk,Java和Python。VTK支持标量,矢量,纹理和体数据的可视化算法,也提供一些高级模型算法,例如隐式函数建模,多边形消减,网格平滑,裁剪,轮廓提取,Delaunay剖分等。VTK包含一个广泛信息可视化框架和一系列3D交互工具。VTK支持并行处理和多种GUI工具数据的集成,如Qt和tk。VTK具有跨平台特性。

VTK官方提供了丰富的文档和丰富的例子教程。VTK虽然是3D可视化工具,但是提供了大量图像和网格处理算法,易于使用。但是个人感觉VTK存在的问题是效率太低,为了满足跨平台特性和易用性,VTK选择的数据结构包含几乎所有的数据信息,导致计算效率较低。并且,VTK提供的算法大部分是传统通用的算法,没有进行效率上的优化,能够实现功能,但是效率是问题。另外,由于历史的问题,VTK的可视化一直只支持OpengGL1.2左右的版本,在VTK7.0之后才逐渐升级到OpenGL2.0,这对于OpenGL已经发布到4.5且停止更新的前提下,VTK的渲染效率也存在一些问题。为了满足管线框架,VTK的源代码比较难懂,对于新手来说,很难进行扩展,所以使用要慎重(个人意见)。

MeshLab/VCG library

MeshLab官方介绍:

MeshLab是一个开源,易用和扩展的系统,可用于处理和编辑非结构化3D三角面片网格。

该系统的主要目的是处理一般3D扫描的生成的非简单非结构化模型。该系统提供了网格编辑,清除,检查,诊断,渲染和转换工具。

该系统基于VCG算法库,VCG算法库是ISTI-CNR的可视化计算实验室开发,可处理所有网格处理核心任务。MeshLab系统开始于2005年,最初是由比萨大学计算机科学系FGT课程中一些动手能力强的学生自愿开发的,第一版的代码量约为15k行。在接下来的几年中,FGT的学生继续完善这个工作,并提供了越来越多的功能特性。

特点:

交互拾取和删除网格的任意部分,包括较大的网格模型。

网格的绘制交互拾取,平滑和上色

多种输入输出格式;第一个支持U3D格式的开源工具

网格清除:

删除重复顶点,未引用顶点,空面片

删除小的孤立组件

调整法矢不一致和法矢翻转

清除非流形面片

自动填补孔洞

重新剖分:

高质量边界的塌陷简化(包括纹理坐标限制的情况)

点集的网格重建(MC和泊松重建)

曲面细分(loop和bufferfly)

特征保持的平滑和光顺

手动填补孔洞

着色和检测:

高斯和均值曲线

扩展边界,测地线距离

非流形边和非流形顶点

自相交面片

环境光遮蔽

交互式网格画刷:画刷颜色;画刷选择;平滑

测量工具:显示网格上点之间的线性测量。

切片工具:导出SVG格式的平面切片

3D扫描工具:

基于ICP的范围映射校正工具,将网格变换到相同的索引空间

融合多个泊松重建的网格

基于渲染的OpenGL Shader

高质量的超大渲染打印(16K x 16K)

可扩展插件架构,可以简答快速添加新的处理,着色和输入输入格式的功能。

VCG Library官方介绍:
  VCG是The Visualization and Computer Graphics Library的缩写,是一个开源易用的C++模板库,用于三角网格和四边形网格的操作,处理和显示。

该算法库包含超过100K行代码,基于GPL协议, 该算法库是意大利国家研究委员会中可视化计算实验室多款工具软件的基础算法,例如metro和MeshLab.

VCG算法库专注于三角网格处理功能:提供广泛且最先进的网格处理功能。例如:

高质量网格简化功能用于处理面片错误和边界塌陷

高效的空间数组结构(均匀网格,hash网格,kd树)

高级网格平滑和光顺算法

曲面计算

纹理坐标优化

Hausdorff距离计算

测地线路径

网格修复能力

等值面提取和高级网格重建算法

泊松圆盘采样和其他点的采样工具

曲面细分

从官方提供的文档可以看出,MeshLab软件依赖于VCG算法库,VCG算法库提供网格检测,网格修复功能,这是CGAL所不具备的功能。另外作为完整的软件,MeshLab提供完成的可视化和交互功能,提供多种OpenGL Shader,还提供了用于快速开发的插件框架,这是其他网格处理工具所不具备的功能,也是MeshLab所独有的优势。

综上所述,要实现原定的功能,没有一个现有的开源算法库能够满足所有的功能,还是需要了解不同的算法库,了解基本原理才是关键。

另外,本次只是比较了现有的4个开源算法库,现有的开源算法库还有OpenMesh,PCL等,有机会再学习介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源库网格算法比较 的相关文章

随机推荐

  • 什么是Scrum?如何实施Scrum(敏捷开发)以及敏捷工具

    什么是Scrum Scrum是一个敏捷开发框架 它是一个增量的 迭代的开发过程 它被广泛应用于敏捷软件开发 在Scrum中 开发过程由若干个短的迭代周期组成 每个迭代周期称为一个Sprint 那么Scrum如何实施呢 Scrum实施过程可分
  • idea使用分享

    ideaVim 配置文件 Source your vimrc source vimrc Suggested options Show a few lines of context around the cursor Note that th
  • 安卓自动化工具程序设计之[识别区域提取] python + uiautomator2 + Open CV

    安卓自动化工具程序设计之 识别区域提取 python uiautomator2 Open CV 一 设计需求 二 所需工具 三 程序设计过程与思路 四 工具使用讲解 五 程序源码 六 写在最后 一 设计需求 在安卓自动化控制中我们经常有需要
  • 健康体检中心

    传智健康 项目介绍 健康管理机构的业务系统 传统的互联网项目 后端系统 前端微信网页 开发人员应该需要的资料 1 需求说明书PRD 含功能大纲 功能详情 流程图 性能需求 产品原型图 2 UI 原型图并非最终效果图 最终要过要以UI为准 所
  • HTML 5概述

    HTML语言是一种简易的文件交换标准 用于物理的文件结构 它旨在定义文件内的对象和描述文件的逻辑结构 而并不定义文件的显示 由于HTML所描述的文件具有极高的适应性 所以特别适合于WWW的出版环境 什么是 HTML5 HTML5是HTML语
  • css选择某元素优先上方显示的方法

    z index 在做一个搜索栏时想要在搜索栏上显示文字提示 当然不是placeholder那种 是一种浮动在搜索栏上固定的元素提供的文本文字 例如这种 查找资料后知道用的是z index 这里是z index的MDN手册说明 z index
  • c语言 结构体排序 相同 下一个,C语言 · 运用结构体的排序方法

    之前遇到排序只想着最原始的方法 诸如冒泡 选择 快速排序等等 刚刚跟大牛学会了结构体的方法来排序 这样的话以后再也不用怕成绩统计 名次排序之类的题目了 首先头文件 基于大牛的方法 本人之后做题喜欢引入题目中常用的五个头文件 定义结构体 注释
  • Java架构师面试题全集:Java基础+技术框架+系统架构+分布式系统

    Java架构师面试题全集 Java基础 技术框架 系统架构 分布式系统 优知学院 2018 10 10 18 45 00 基础题目 Java线程的状态 进程和线程的区别 进程间如何通讯 线程间如何通讯 HashMap的数据结构是什么 如何实
  • excel表格中忘了撤销工作表保护密码怎么办

    转自 https zhidao baidu com question 297630230 html 用宏代码破解密码 以office2007为例说明 2003也是一样的 只是菜单命令的位置不同 第一步 打开该文件 先解除默认的 宏禁用 状态
  • 深入解析QUIC协议

    QUIC Quick UDP Internet Connection 是Google提出的一个基于UDP的传输协议 因其高效的传输效率和多路并发的能力 已经成为下一代互联网协议HTTP 3的底层传输协议 除了应用于Web领域 它的优势同样适
  • 2023前端面试题

    HTML CSS 1 块元素垂直居中 1 弹性布局 display flex justify content center align items center 2 定位 position absolute left 50 top 50 t
  • LinkedHashMap常用方法源码

    类介绍 注释 add contains remove 方法 时间复杂度是O 1 LinkedHashMap的遍历耗时 与 capacity无关 与map的size 元素多少 呈线性 HashMap的遍历 可能比 LinkedHashMap更
  • 数据结构与算法:线索二叉树

    线索二叉树 线索二叉树原理 首先我们要来看看这空指针有多少个呢 对于一个有n个结点的二叉链表 每个结点有指向左右孩子的两个指针域 所以一共是2n个指针域 而n个结点的二叉树一共有n 1条分支线数 也就是说 其实是存在2n n 1 n 1个空
  • 一款界面友好的思维导图软件MindMaster

    一款界面友好的思维导图软件MindMaster MindMaster 官网 http www edrawsoft cn mindmaster 官网提供免费版下载 能满足基本功能需要 专业版需付费 如想尝试专业版请氪金或自行百度 MindMa
  • 绘图常见问题

    1 不同配置的电脑只是影响出图速度吗 答 是的 配置不同 绘图的速度会有一定差异 2 同一关键词在不同电脑的结果会有差别吗 答 不一定 但是有一定概率 基本不会重复 3 绘图关键词的数量有限制么 答 没有限制 一般建议三到五个关键词 4 对
  • PHP编译安装报错,make:*libtool: link: `ext/libxml/libxml.lo‘ is not a valid libtool object

    亲测可用 若有疑问请私信 把 php的源代码目录 你make过的 删掉 再解压 然后再 make 应该就 ok 了 我以前也遇到过这种问题 make clean后在make make install 就ok了 要把原先的make产生的信息清
  • 几何基础,多种矩阵的学习,世界坐标到屏幕坐标的两种转换方法,三种绘制方框的原理,hookd3d,hookopengl,骨骼透视,主播的秘密,FPS各种BT功能的原理 和检测对抗原理,UE4引擎,U3D

    为了方便大家可以系统性的学习 和了解FPS游戏相关知识 导致本帖包含的内容比较繁多 如果没有耐心全部看完的话 也可以直接跳到自己需要的知识点进行学习 下面介绍下 本帖主要内容包含 几何基础 多种矩阵的学习 世界坐标到屏幕坐标的两种转换方法
  • C++,M个苹果放N个盘子内有几种分法,允许空盘,1,5,1 、5,1,1是一种分法

    一个盘子可以放多个苹果 且允许空盘 那么我们可以利用递归来解题 首先可以分为几种情况 第一种 比如m 1 或者n 1 这种情况只能有一种分法 第二种 比如M
  • ArcGIS 10.1 Engine Developer Kit 和 ArcGIS 10.1 Engine 快速入门指南

    http resources arcgis com zh cn help quick start guides 10 1 index html 01q100000004000000 ArcGIS 10 1 Engine Developer
  • 开源库网格算法比较

    对于Mesh 我们通常分为结构化网格和非结构化网格 理解很简单 除了四边形和六面体是结构化网格 其它都是非结构化网格 最近在学习网格算法 本人关心的主要是3D网格相关的算法 总结了一下主要包括 网格生成 网格平滑 网格参数化 网格重新剖分