非流形边Non-Manifold Edges

好博客:[Non-Manifold Edges in 3D Printing – What They Are and How to Fix Them - 3D Insider](https://3dinsider.com/non-manifold-edges-3d-printing/#:~:text=Non-manifold edges refer to the edges of an,other%2C areas with no thickness%2C and internal walls.)

参考博客:How to fix non-manifold geometry issues on 3D models

3D建模软件可以成为很好的工具,因为它们使您能够将想法转化为形状。另一方面,当你遇到设计问题时,它们可能会变成一场噩梦,比如非流形边。通常情况下,您可以上传3D文件进行3D打印,但由于它包含非流形几何形状,因此无法打印。在这篇文章中,除了我们为您提供的关于如何修复3D文件的其他指导方针外,我们还将尝试找出如何修复非流形问题并防止发生此类错误。让我们一起确保您将准备一个可打印的3D设计。

什么是 non-manifold geometry

非流形几何体是一种三维形状,不能展开为所有法线指向同一方向的二维曲面。

法线是一个垂直于对象表面的向量。在三维建模时,法线是设计者手动设置的参数,也可以由软件自动定义。
下图以一种说明性的方式展示了什么是正常。

这是创建数字对象时可能出现的一个非常常见的错误。这是因为在创建3D模型的过程中,一些操作可能会创建未连接的曲面,也可能会分割曲面。也可能发生的情况是,彼此附着的面连接到一个点,而不是连接到一条边。因此,你得到了一个非流形边。此外,应修复或完全消除创建没有体积的形状的错误。一旦你使用了3D建模软件,这些错误可能就不可见了,因为你是在处理整个3D模型的形状和体积。然而,在进行3D渲染时,3D模型正在被转换为3D帧模型。在此过程中,将指定其边和顶点,并在每条边的位置将对象绘制为一组线。

因此,如果3D模型包含非流形建模错误,则渲染3D文件时看起来会有所不同。如果其线框没有精确确定,3D打印机的软件将难以读取文件,因此可能无法成功打印对象。

为什么3D打印必须使用流形网格

非流形几何是一种在现实世界中不可能存在的几何,除非非常技术化。这意味着3D模型可以以数字方式表示,但现实世界中没有几何体可以物理地支持它。由于3D模型的网格是由边、面和顶点定义的,因此它必须是流形的。如果它是非流形网格,则意味着3D模型中存在无法精确定义3D模型几何形状的错误。3D打印机的软件正在读取模型的精确几何表示,以便打印出来。因此,如果3D设计包含非流形建模错误,导致无法实现这种几何精度,3D打印机将无法识别3D文件,从而无法打印3D模型。

How to fix non-manifold geometries

Type of non-manifold error n°1: Multiply connected geometry

The shape in the image below represents a typical non-manifold geometry, which you can also find as “T-type”. In this case, there are three faces sharing a single edge.(有面但是不封闭成体积)

Correcting non-manifold issues like this is easy: you should eliminate the non-manifold surface either by giving it volume or by deleting it completely.(删除或补全)

Type of non-manifold error n°2: Several surfaces connected to a single vertex

In the following picture, we see another common non-manifold geometry, which is often called “bow-type”. In this case, there are more than two surfaces connected to a vertex. This is practically impossible, as there cannot be multiple faces sharing a common vertex but no edge.(一个点连接多个平面)

This error could be eliminated by either disconnecting the cubes from each other or by deleting one of them completely.(断开多维数据集之间的连接,也就是分开处理,或者直接删去)

在三维网格处理(如计算机图形学、有限元分析等)中,如果两个以上的面连接到一个点,可能会导致以下问题:

  1. 拓扑不一致:多于两个面的相交会在顶点附近产生不一致的拓扑结构,尤其是当这些面相交在一个尖锐的角上。这样的拓扑不一致可能导致渲染或计算中出现错误。
  2. 形变和渲染问题:在渲染过程中,多面共顶可能导致表面法线计算不准确,进而影响阴影和光照效果,使表面显示异常。在形变操作(例如平滑)中,多面共顶点会导致不自然的形状变化。
  3. 数据冗余:如果多个面在一个点连接,会增加计算和存储的复杂性,因为需要额外的内存和处理来处理该点的相邻面。这可能会影响性能,尤其在大规模网格上。
  4. 计算不稳定性:在有限元分析等计算中,多面共顶点可能导致刚度矩阵和其他计算的数值不稳定性,进而影响仿真结果的精度。

在三维网格处理时,通常建议避免多个面在同一顶点过度聚集,必要时可以通过重新划分网格增加顶点数量来解决。

Type of non-manifold error n°3: Open objects

This model represents a cube with surfaces with zero volume, as well as there are two missing surfaces. In the real world, this model cannot exist as it is.(开口,不封闭,有洞)

In order to fix this geometry, you have two alternatives. Either to adjust the wall thickness of the box or to close the box with adding two new surfaces. In both cases, the cube has a valid volume and it can be 3D printed.(添加壁厚或者修补完整)

Type of non-manifold error n°4: Internal faces

In the following image, we see the wireframe of a cube. From this perspective, we see an internal face that is totally unnecessary.

This error can be easily fixed by just deleting the internal face. If you do not delete that face, the software of the 3D printer will have difficulty in reading your file.(删除内部面即可)

Type of non-manifold error n°5: Opposite normals

In this example, we see a single shape with two adjacent faces which have opposite normals. This error could be hard to detect, as it is the least obvious one.(法线反了)

Once you detect the error, it is easy to fix it, by just reversing the normals, so that they point the same direction(反转法线)

及时处理

纠正下载模型中的非流形几何是一回事,但如果你也制作自己的3D模型,你也要避免犯同样的错误。令人欣慰的是,当你知道非流形几何通常在何时何地发生时,避免它们会变得容易得多。

在CAD建模中,布尔运算是指两个或多个形状的并集、减法或交集。布尔运算通常也是非流形边出现的地方。防止这种情况发生的最佳方法是每次执行布尔运算时检查非流形边。

如果你同时处理大型或多个对象,这可能会变得困难。另一个值得注意的提示是在线框模式下检查非流形边。这会使任何不需要的面或边更明显。

无论您选择哪种方法,请记住,当您的模型仍然很小很简单时,在早期删除非流形边要容易得多。必须纠正你几个小时前做的非流形边缘,这真的会打乱你的工作流程,并可能撤消和重做你已经完成的工作。它们也往往具有滚雪球效应,因为一个非流形误差会产生另一个。

具体方法(meshlab)

选择你的三维网格文件,或在meshlab中打开。

观察是否水密的方法

Filters > Quality Measure and Computations > compute Geometic Measures

log 处会显示三维信息,

表示你的mesh不水密,寄。

造成网格不水密的原因可能有以下几种:

  1. 几何问题
    • 孔洞:网格中存在未被覆盖的空隙或孔洞,导致形状不封闭。
    • 重叠或错位的面:不同面之间存在重叠、交叉或错位的情况,导致网格不连通。
    • 自交:网格表面与自身相交,导致形成不规则的形状。
  2. 网格生成过程中的错误
    • 插值问题:在网格生成过程中,点、线或面插值错误可能导致连接断裂或重叠。
    • 不一致的法向量:网格的面法向量方向不一致,导致某些面无法正确连接或无法识别面之间的关系。
  3. 网格细化或简化问题
    • 过度细化或简化:在网格简化或细化过程中,可能会错误地移除或改变一些关键的连接,导致网格破裂或不闭合。
    • 不规则的三角形或四边形:不规则的网格单元(如长条形或极端扭曲的单元)可能导致网格无法正确连接。
  4. 数据处理错误
    • 点云数据问题:从点云生成网格时,点云数据可能不完整或存在噪声,导致网格生成时无法保证水密性。
    • 文件格式问题:在转换网格文件格式时,可能会丢失部分数据或导致数据格式不兼容,从而破坏网格的水密性。
  5. 数值误差
    • 数值计算误差:在进行网格优化或转换时,浮动的小数误差可能导致不完全封闭的面或边界。
    • 精度不足:在网格生成时,使用的数值精度可能不够高,导致连接点或面之间的微小偏差,造成网格的非水密性。

补洞

补洞:Filters - Remeshing,Simplification and Reconstruction - Close Holes

根据补洞的参数进行调整,一般来讲补洞效果还行。

观察非流形边并删除

Filters - Selection- Select non Manifold Edges会将网格中的非流形边和相关面标红。

选择非流形边后,可以再使用Filters - Selection- Delete Selected Faces and Verties删除,不过这样会留下孔洞,处理起来更复杂。

重建:

体素重建,poisson重建都可以逃课,但是我这里用的poisson重建,也有相关代码pymeshlab。

Filters - Remeshing,Simplification and Reconstruction- Surface Reconstruction

可以调整精细度,也可以点击copy代码按钮,主要方法:

Copy pymeshlab代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ms.generate_surface_reconstruction_screened_poisson()
# pip install pymeshlab
import pymeshlab
def poisson_reconstruction(input_path, output_path, depth=8):
# 初始化 PyMeshLab 工作空间
ms = pymeshlab.MeshSet()
# 加载输入网格文件
ms.load_new_mesh(input_path)

# 根据你所选择的代码改这个函数,
# 执行 Screened Poisson Surface 重建
ms.generate_surface_reconstruction_screened_poisson()# 参数在meshlab客户端也可以调整,会反馈到代码中
# 保存重建后水密网格
ms.save_current_mesh(output_path)

# 对两个网格进行 Poisson 重建,保存水密的重建结果
poisson_reconstruction("mesh1.obj", "reconstructed_mesh1.obj")
poisson_reconstruction("mesh2.obj", "reconstructed_mesh2.obj")

# 使用 Trimesh 加载重建后的水密网格
mesh1 = trimesh.load("reconstructed_mesh1.obj")
mesh2 = trimesh.load("reconstructed_mesh2.obj")