开源库网格算法比较

对于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等,有机会再学习介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除单链表偶数节点

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下: struct ListNode { int data; struct ListNode *next; }; 函数接口定义: struct ListNode *createlist(); struct ListNode *deleteeven( …

Git的安装以及基础使用方法

Git是一种分布式版本控制系统,被广泛用于管理代码、文档和任何其他类型的数据。它允许开发者在团队中协作,并且在处理大型项目时可以保持代码的完整性。 这里写目录标题 一、安装和设置二、基本的Git命令三、分支和合并四、标签和远程仓库 一、安装和设置…

架构师spring boot 面试题

spring boot 微服务有哪些特点? Spring Boot 微服务具有以下特点: 独立性:每个微服务都是独立的部署单元,有自己的代码库和数据库。这使得微服务可以独立开发、测试、部署和扩展。 分布式:微服务架构将一个大型应用程…

pdf怎么转换成jpg图片?

随着数字文档的广泛应用,将PDF转换为JPG图片格式成为了一个常见的需求。无论是为了在网页上展示内容,还是为了与他人分享图片,以下是一些简单的方法,帮助您将PDF文件快速转换为高质量的JPG图片。 方法一:在线PDF转JPG…

手写Mybatis:第12章-完善ORM框架,增删改查操作

文章目录 一、目标:完善增删改查二、设计:完善增删改查三、实现:完善增删改查3.1 工程结构3.2 完善增删改查类图3.3 扩展解析元素3.4 新增执行方法3.4.1 执行器接口添加update3.4.2 执行器抽象基类3.4.3 简单执行器 3.5 语句处理器实现3.5.1 …

Nginx - 根据请求参数路由进行不同的响应

文章目录 需求思路 需求 业务有一个统一入口 /api/biz?type1 /api/biz/type2需要对不同的接口实现流控 最常见的是通过location进行路径匹配的时候,但是无法使用正则表达一起捕获这个路径和querstring的参数。如果我们想通过URL里面的Query String进行不同的rew…

ChatGPT 插件 “Consensus“ 实现论文搜索功能;数据工程在语言建模中的重要性

🦉 AI新闻 🚀 ChatGPT 插件 “Consensus” 实现论文搜索功能 摘要:OpenAI 推出了一个名为 “Consensus” 的插件,可在 ChatGPT 上进行论文搜索。用户只需用一句话描述自己想了解的问题,插件就能从 2 亿篇论文中搜索并…

关于unordered_map中元素的插入顺序与遍历顺序问题

最近做一个项目遇到一个问题困扰我两天,差点自闭。经排查是 插入到unordered_map中的键值对的顺序和实际的键值对存在的顺序没有关系 众所周知,unordered_map插入元素后,键值不会自动排序,但是顺序却不一定和插入顺序一致。msvc和gcc编译器也各不相同。 std::unordered_map&l…

使用Puppeteer爬取地图上的用户评价和评论

导语 在互联网时代,获取用户的反馈和意见是非常重要的,它可以帮助我们了解用户的需求和喜好,提高我们的产品和服务质量。有时候,我们需要从地图上爬取用户对某些地点或商家的评价和评论,这样我们就可以分析用户对不同…

Java方法的使用

目录 一、方法的概念及使用 二、方法的重载 三、递归 一、方法的概念及使用 1、方法的概念 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系(重要) 5、没有返回值的方法 二、方法的重载 三、递归 1、递归的概念 一、方法的概念及使用 1、方法的概念 方法…

java八股文面试[数据库]——InnoDB与MyISAM的区别

InnoDB和MyISAM是使用MySQL时最常用的两种引擎类型,我们重点来看下两者区别。 事务和外键 InnoDB支持事务和外键,支持回滚,具有安全性和完整性,适合大量insert或update操作 MyISAM不支持事务和外键,它提供高速存储和…

ElementUI浅尝辄止29:Breadcrumb 面包屑

显示当前页面的路径,快速返回之前的任意页面。 1.如何使用? 在el-breadcrumb中使用el-breadcrumb-item标签表示从首页开始的每一级。Element 提供了一个separator属性,在el-breadcrumb标签中设置它来决定分隔符,它只能是字符串&am…

Ue5 C++ metahuman

#创建metahuman# 参考官网: 创建MetaHuman | Epic Developer Community (epicgames.com) #在UE中怎么找到metahuman# 参考: Quixel Bridge中的MetaHuman | Epic Developer Community (epicgames.com) #将metahuman 导入到UE中# 参考:导出…

前端技术搭建五子棋游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了拼图游戏,今天还是继续按照我们原定的节奏来带领大家完成一个五子棋游戏,功能也比较简单简单,也…

python字符串相关

python字符串相关 一、reverse() 函数 只能反转 列表二、reversed() 反转元组字符串等等 返回迭代器三、join和reversed反转字符串四、join串联字符串(join连接对象仅限字符串、储存字符串的元组、列表、字典)数字对象可通过str()转化为字符串⭐对象为字…

JavaScript 数组手册 – 通过示例和备忘单了解 JS 数组方法如何工作

在编程中,数组是包含元素集合的数据结构。数组非常有用,因为您可以在单个数组中存储、访问和操作多个元素。 在本手册中,您将学习如何在 JavaScript 中使用数组。我们将介绍创建数组时需要遵循的特定规则,以及如何使用数组方法根…

Fiddler安装与使用教程(2) —— 软测大玩家

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

力扣(LeetCode)算法_C++——移位字符串分组

给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:“abc” -> “bcd”。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列&am…

李宏毅-21-hw3:对11种食物进行分类-CNN

一、代码慢慢阅读理解总结内化: 1.关于torch.nn.covd2d()的参数含义、具体用法、功能: (1)参数含义: 注意,里面的“padding”参数:《both》side所以是上下左右《四》边都会加一个padding数量…

二叉树的递归遍历和非递归遍历

目录 一.二叉树的递归遍历 1.先序遍历二叉树 2.中序遍历二叉树 3.后序遍历二叉树 二.非递归遍历(栈) 1.先序遍历 2.中序遍历 3.后序遍历 一.二叉树的递归遍历 定义二叉树 #其中TElemType可以是int或者是char,根据要求自定 typedef struct BiNode{TElemType data;stru…