三角网格(Triangle Mesh)

最简单的情形,多边形网格不过是一个多边形列表;三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑、车辆、人体,当然还有茶壶等。

当然,任意多边形网格都能转换成三角网格,三角网格以其简单性而吸引人,相对于一般多边形网格,许多操作对三角网格更容易。

术语"网格"隐含的相邻三角形的连通性却未在这种简单表示中有任何体现。实际应用中出现的三角网格,每个三角形都和其他三角形共享边。于是,三角网格需要存储三类信息:

  • 顶点。每个三角形都有三个顶点,各顶点都有可能和其他三角形共享。
  • 边。连接两个顶点的边,每个三角形有三条边。
  • 面。每个三角形对应一个面,我们可以用顶点或边列表表示面。

索引三角mesh:
在索引三角网格中,我们维护了两个列表:顶点表(Vertex buffer)与三角形表(Index Buffer)。每个顶点包含一个3D位置,也可能有如纹理映射坐标、表面法向量、光照值等附加数据。每个三角形由顶点列表的三个索引组成。通常,顶点列出的顺序是非常重要的,因为我们必须考虑面的"正面"和"反面"。从前面看时,我们将用顺时针方向列出顶点。另外一些信息也存在这一级中,如预先计算的表面法向量,表面属性(纹理映射)等。

实践中,三角网格类会有一系列方法,用于存取和维护顶点、三角形列表。当然,存储多边形网格,还需要定义一个多边形类,用来表达有任意多顶点的面。为简化和提高效率,我们可以对每个多边形的最大定点数做出限制。 注意到,索引三角形列表中的邻接信息是隐含的。例如:边信息没有直接存储,但我们还是可以通过搜索三角形表找出公共边。和前面"三角形数组"方式相比,这种方式确实能节省不少空间。原因是信息存于顶点级别,它的整数索引比之三角形数组里存储的顶点重复率要小得多。
简单索引三角网格对于基本应用已经足够了,但为了更加高效地实现某些操作还可以进行一些改进。主要的问题是邻接信息没有显式表达,所以必须从三角形列表中搜索。另一种表达方法可以在常数时间内取得这种信息。
方法是维护一个边列表,每个边由两个端点定义,同时维护一个共享该边的三角形列表。这样,三角形可视为三条边而非三个点的列表,也就是说它是边列表而不是点列表的索引。该思想的一个扩展称作" Wedge "模型,对每一顶点,存储使用该点的边的索引。

渲染不直接支持索引三角面,大多数图形卡并不直接支持索引三角网,渲染三角形时,一般是将三个顶点同时提交。这样,共享顶点会多次提交,三角形用到一次就提交一次。因为内存和图形硬件间的数据传输是瓶颈,所以许多API和硬件支持特殊的三角网格式以减少传输量。基本思想是排序点和面,使得现存中已有的三角形不需要再次传输。

从最高灵活性到最低灵活性,我们讨论三种方案:顶点缓存,三角带,三角扇

顶点缓存:

与其说顶点缓存是一种特殊的存储格式,不如说是API和硬件之间的一种存储策略,用以发挥连续三角形顶点一致性的特点。通常,高级代码不需要了解顶点缓存是如何实现和执行的。
和其他缓存机制类似,顶点缓存基于最近使用的数据将来仍被使用的原则。图形处理器缓存一小部分(如,16个)最近使用的顶点,当API要发送顶点时,首先探测缓存内是否已存在。当然,这要求API了解图形卡缓存的大小和替换机制。若缓存内没有该顶点,则发生脱靶,API发送顶点并更新缓存;若缓存内有该顶点,就命中,API通知图形卡"使用缓存内位置x的顶点"。
顶点缓存其实是一种底层的优化手段,任何三角网都可用高级代码实现正确渲染而不用考虑缓存。但进行顶点顺序的调整,使共享顶点的三角形集中发送有助于提高效率。这种调整只需要进行一次,并且可以离线进行,它只会对性能有帮助,不会使没有缓存的系统性能降低。善用缓存,可能使发送到显卡的顶点数降低到平均每三角形少于一个。


三角带是一个三角形列表,其中每个三角形都与前一个三角形共享一边。

注意顶点列出的顺序使得每三个连续的点都能构成一个三角形。例如:

  1. 顶点1、2、3构成第一个三角形。
  2. 顶点2、3、4构成第二个三角形。
  3. 顶点3、4、5构成第三个三角形。

顶点以构成三角形带的顺序编号。“索引"信息不再需要,因为顶点顺序已经隐式定义了三角形。通常,列表前部有顶点数目,或末尾处有一特殊码表示"列表结束”。

注意到,顶点顺序在顺指针和逆时针间不断变换。某些平台上,需要指出第一个三角形的顶点顺序,而有些平台上顺序是固定的。
最佳情况下,三角带可用n+2个顶点存储n个面。n很大时,每个三角形平均发送一个顶点,遗憾的是,这只是最佳情况。实践中,很多网格是一个三角形带无法表达的,不仅如此,3个以上三角形共享的顶点还是要多次发送给图形卡。从另一方面说,每个三角形至少要发送一个顶点。但在顶点缓存机制中,有可能将每个三角形发送的顶点数降到一个以下。当然,顶点缓存需要额外的簿记信息(索引和缓存管理数据),可是尽管这些额外信息对单个顶点来讲相对较大,操作速度也会相对下降,但发送顶点数最少的系统在特定平台上速度最快。


三角扇使用n+2个顶点存储n个面,和三角带相同。但是,第一个顶点必须为所有三角形共享,所以实践中不太经常能找到大型三角扇应用的场合。并且,三角扇不能像三角带那样连接。所以,三角扇只能在特殊场合应用,对一般应用来说,三角带更灵活。

三角网格Mesh的属性:
纹理映射坐标: 纹理映射是将位图(称作"纹理图"或简称"纹理")贴到多边形表面的过程。这里只给出一个高度简化的解释:我们希望将2D纹理贴到多边形表面上,同时考虑多边形在摄像机空间的方向。对多边形中每个需要渲染的像素都要计算2D纹理映射坐标,这些坐标用以索引纹理图,从而为相应像素着色。通常,在顶点保存纹理映射坐标,三角形面中其余各点的坐标通过插值进行计算。

法向量

三角形级法向量可以通过两向量叉乘的方法轻松获得,而顶点级法向量的计算则困难一些。首先,应注意到顶点处其实是没有法向量定义的,因为此处网格表面不连续。第二,三角网是对连续表面的逼近,所以我们实际想要的是连续表面的法向量。根据产生三角网的方法,这种信息不一定现成可得。如果网格是自动生成的,比如说从参数曲面上,则可以直接获得法向量。
若法向量没有提供,则必得有现成数据(顶点位置和三角形)生成。一个技巧是平均相邻三角形的表面法向量并将结果标准化。当然,这要求知道三角形法向量。一般可以假设三角形顶点以顺时针列出,通过叉乘计算外表面的法向量。如果顶点顺序不能假设时,可使用Glassner建议的方法。
通过平均三角形法向量求得顶点法向量是一种经验性方法,大多数情况下都能工作得很好。但是有必要指出,某些情况下,其结果并不是所期望的。最明显的例子是两个法向量刚好相反的三角形共享一个顶点。这种情形常发生在"公告板"物体上。“公告板"由两个三角形背靠背构成,它的两个法向量方向恰好相反,其平均值为0不能标准化。为解决这种问题,必须拆开所谓的"双面"三角形。
平均顶点法向量的另一个问题会在应用Gouraud着色时发生,这里给出一个简化的解释:光照是按顶点法向量逐点计算的。如果使用平均三角形法向量计算的顶点法向量,某些应该有尖锐边缘的地方会显得"过于平滑”。以最简单的盒子为例,边缘处应该有一个剧烈的关照变化。如果我们使用平均顶点法向量,这个剧烈变化会消失。

拓扑与一致性

  • 孤立顶点:顶点未被任何三角形使用。
  • 重复顶点:完全相同的顶点。使用这些点的三角形几何上相邻而逻辑上不相邻,多数情况下,我们不希望看到这种现象,应该删除。
  • 退化三角形:使用一顶点超过一次的三角形。意味着这个三角形没有面积,一般这种三角形应该删除。
  • 开放边:仅为一个三角形所使用。
  • 超过两个三角形共享的边:封闭网格中,任一边必须为两个三角形共享。
  • 重复面:网格中包含有两个或更多相同的面。这是不希望看到的,应该去掉多余面而只保留一个。

四角网格Mesh

四边形网格定义
* 四边形网格,顾名思义,它的每个网格面片是一个四边形。有时候,四边形网格里会掺杂一些三角形面片,我们把这类网格也都叫做四边形网格。三角形网格常见于逆向建模领域,比如通过三维扫描仪扫描得到的网格。四边形网格常见于正向建模系统,如3dsMax,ZBrush等。这主要是因为点云或者三角形网格转成四边形网格有一定的难度,特别是高质量的四边形网格。
* 正则点:内点-度数为4;边界点(非拐点(Corner))-度数为3;边界点(凸拐点)-度数为2;边界点(凹拐点)-度数为4
* 分类:主要是根据顶点的正则度来进行分类。如下图所示,第一类网格为正则网格,所有顶点度数为4,只有特殊拓扑结构的网格能达到正则;第二类是半正则网格,它是分片正则的;第三类是度数半正则网格,它的顶点度数绝大部分是4;最后一类是无序的四边形网格,它有很多非正则点。

四边形网格的优缺点与三角形网格相比,四边形网格有一些优点
* 特征边对齐:四边形网格的边可以很自然的与特征边进行对齐,边走向也可以很自然的与模型的几何特征走向对齐。
* 样条曲面和细分曲面:样条曲面和Catmull-Clark细分曲面常见的定义域就是四边形。
* 纹理贴图:半正则的四边形网格,每个正则片可以很好的与图片对齐,有利于图片的采样精确性。

同时四边形网格也有一些缺点
* 四边形可能不共面。

高质量的四边形网格
* 奇异点个数尽量少,布局合理
* 面片的边走向要与几何特征走向对齐
* 边长尽量均匀化,或者自适应几何特征

生成四边形网格的方法正向建模软件可以直接创建四边形网格。逆向建模的网格一般是三角形网格,需要方法把三角形网格转成四边形网格
* Catmull-Clark细分三角形可以得到一个四边形网格,它的质量比较低,奇异点多,边走向不好。后续可以应用一些四边形网格优化的方法
* 参数化方法
* Morse-Smale complex 方法
* 网格分割后,分片参数化的方法

四边形Mesh比三边形Mesh有什么好处?四边形单元对于有限元来说计算精度更高, 所以我们要画四边形单元。有限元分析 (FEA) 是一种计算机化方法,可预测产品对现实世界中的力、振动、热、流体流动和其他物理效果做出的反应。有限元分析可以表明产品是否会断裂、磨损或者是否在按照设计的方式工作。这称为“分析”,但在产品开发流程中,该分析用于预测在产品使用过程中会出现的状况。FEA 通过将真实对象分解为大量(数千到数十万个)有限元素(如小立方体)来进行分析。数学方程式可帮助预测每个元素的行为。然后,计算机通过累加所有单个行为就能预测实际对象的行为。有限元分析可帮助预测产品在如下各种物理效果的影响下的行为:
* 机械应力
* 机械振动
* 疲劳
* 运动
* 传热
* 流体流动
* 静电
* 注塑成型

三角网格(Triangle Mesh)与四角mesh网格理解总结相关推荐

  1. ansys workbench中fluent划分网格出现如下错误:The mesh file exporter failed during translation.

    ansys workbench中fluent划分网格出现如下错误:The mesh file exporter failed during translation. Please send your ...

  2. 【Unity】Mesh网格编程(三)万能网格几何形体

    用一个通用代码,实现各种锥.柱.管状体的网格创建. 非原创的同系列.虽然总觉得代码上可以再优化,但是实现的功能已经超级屌了. 真是没有不能做的,只有想不到的. 原文: Mesh网格编程(二) 万能网格 ...

  3. 网格半边结构(Half edge mesh)

    网格半边结构(Half edge mesh) 1.网格的表示 在计算机图形学上,表达表面网格的数据结构有三种,分别是面列表( List of faces).邻接矩阵(Adjacency matrix) ...

  4. 【CGAL_网格处理】Isotropic Remeshing均匀化网格

    原理 算法伪代码如下: remesh(target_edge_length)low = 4/5 * target_edge_lengthhigh = 4/3 * target_edge_lengthf ...

  5. icem网格划分如何给内部面网格_icem结构化网格划分 ICEM里面设置一下就可以自动划分网格,为什么要用块?...

    ICEM里面设置一下就可以自动划分网格,为什么要用块? 块划分方法是结构化网格划分,相比于非结构化网格有较规则形状的网格质量可以做的很高,进行数值计算时也可以采用更高阶的格式(非结构化最高二阶精度). ...

  6. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  7. css网格_我如何记住CSS网格属性

    css网格 The syntax for CSS Grid is foreign and hard to remember. But if you can't remember CSS Grid's ...

  8. jqgrid使用本地静态数据创建网格的例子_什么是网格布局?grid布局有哪些优势?开发过程中遇到什么问题?...

    链接:https://www.jianshu.com/p/d183265a8dad 目前浏览器还不支持Grid布局,IE10和IE11支持老的语法.如果你想体验Grid布局的强大,推荐使用开通过&qu ...

  9. easyui treegrid php,jQuery EasyUI 数据网格与树插件 – Treegrid 树形网格 | 菜鸟教程

    jQuery EasyUI 数据网格与树插件 - Treegrid 树形网格 jQuery EasyUI 插件 扩展自 $.fn.datagrid.defaults.通过 $.fn.treegrid. ...

  10. 网格员计算机考试基础知识,网格员考题_请问下网格员考试的内容题目是什么要复习什么_淘题吧...

    ① 2020济南市中区网格员笔试考什么 济南市中区网格员笔试内容如下: 笔试采取统一命题.统一考试.统一标准.统一阅卷的方式进行.笔试内容为综合知识,包括公共基础知识.语言理解及表达.时事政治.阅读理 ...

最新文章

  1. svcagent32.exe,javaM.exe木马查杀解决方案 (转Ad0.cn)
  2. flask_socketio 用法:
  3. 基于100,000篇演讲的分析数据科学家发现了最佳演讲者的特征——及时解释听众不懂的词语,必要时提高10%的音调,正确和恰当的手势,氛围的营造...
  4. cordova常用命令
  5. mybatis元素类型为 “resultMap“ 的内容必须匹配 “(constructor?,id *,result*,association报错解决
  6. 文件用户如何将一个有界面的正常app和一个或多个越狱插件.deb同时安装到手机上...
  7. matlab显示曲线图中某个点的坐标值
  8. 一文学搞懂阿里开源的微服务新贵Nacos!
  9. 信息学奥赛一本通(2056:【例3.7】最大的数)
  10. java 类型推导_Java10类型推导
  11. js实现螺旋矩阵算法
  12. java并发之线程安全---java并发编程实践
  13. linux目录结构和份文件系统
  14. 大二学科不挂科 速冲方法推荐(离散+概率+数电+大物)
  15. 二月(不积跬步无以至千里)
  16. 三个重要的事件来看软件测试的重要性和软件测试的行情
  17. win8虚拟机_VMware 15虚拟机VM软件安装教程
  18. Android史上最强分割线全攻略
  19. 中国推出网上“防沉迷系统”
  20. 同步linux服务器时间

热门文章

  1. Spring Boot 事务详解
  2. ERNIE(二妮儿)模型初探
  3. U3D DotH教程3
  4. JAVA常用数据结构
  5. ddl是什么意思网络语_DDL是什么意思?DDL跟数据库关系介绍 常见的DDL语句分享...
  6. Ubuntu 如何安装 微信?实测
  7. [unity小游戏]小球运动初步制作1.0版
  8. 从零开始学springboot笔记(一)-Spring boot之Hello Word
  9. 【正点原子STM32】delay.c文件里关于fac_us=SystemCoreClock/8000000的讲解
  10. Puppet erb模板介绍(三十二)