三角网格(Triangle Mesh)与四角mesh网格理解总结

三角网格(Triangle Mesh)

最简单的情形,多边形网格不过是一个多边形列表;三角网格就是全部由三角形组成的多边形网格。多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑、车辆、人体,当然还有茶壶等。
3D max中的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 通过将真实对象分解为大量(数千到数十万个)有限元素(如小立方体)来进行分析。数学方程式可帮助预测每个元素的行为。然后,计算机通过累加所有单个行为就能预测实际对象的行为。有限元分析可帮助预测产品在如下各种物理效果的影响下的行为:
* 机械应力
* 机械振动
* 疲劳
* 运动
* 传热
* 流体流动
* 静电
* 注塑成型

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在3D 0.10.0版本中,`TriangleMesh`类提供了以下方法可以将点云数据转换为三角网格模型: 1. `create_from_point_cloud_poisson`: 使用Poisson重建算法从点云数据创建三角网格模型。 2. `create_from_point_cloud_ball_pivoting`: 使用Ball Pivoting算法从点云数据创建三角网格模型。 3. `create_from_point_cloud_alpha_shape`: 使用alpha形状参数从点云数据创建三角网格模型。 4. `create_from_depth_image`: 从深度图像和相机内参创建三角网格模型。 5. `create_coordinate_frame`: 创建一个三维坐标系的三角网格模型。 6. `create_box`: 从一个边长为1的立方体创建三角网格模型。 7. `create_sphere`: 从一个半径为1的球体创建三角网格模型。 8. `create_cylinder`: 从一个高度为1、半径为1的圆柱体创建三角网格模型。 9. `create_cone`: 从一个高度为1、半径为1的圆锥体创建三角网格模型。 10. `create_torus`: 从一个半径为1、圆环半径为0.25的环面创建三角网格模型。 您可以根据需要选择其中的一个方法将点云数据转换为三角网格模型。例如,使用`create_from_point_cloud_alpha_shape`方法可以按照以下方式将点云数据转换为三角网格模型: ```python import open3d as o3d # 读取点云文件 pcd = o3d.io.read_point_cloud("point_cloud.ply") # 定义alpha形状参数 alpha = 0.1 # 使用alpha形状参数从点云数据创建三角网格模型 bpa_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha) # 显示三角网格模型 o3d.visualization.draw_geometries([bpa_mesh]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值