前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从STL文件到网格拓扑

从STL文件到网格拓扑

作者头像
NT4.4
修改2019-10-25 10:18:29
8900
修改2019-10-25 10:18:29
举报
文章被收录于专栏:图形视觉图形视觉

原文链接

STL文件是什么

STL文件是网格文件的一种格式,分为二进制和文本两种类型。具体来讲,它定义了一群三角面片,比如下面是一个文本的STL示例:

代码语言:javascript
复制
    solid geometryplusplus
        facet normal -0.902325 -0.430279 -0.0258872
            outer loop
              vertex -86.941 -297.521 -115.031
              vertex -87.0579 -297.277 -115.053
              vertex -86.9864 -297.4 -115.516
            endloop
        endfacet
        facet normal -0.94428 -0.0796825 0.319353
            outer loop
              vertex -87.2002 -296.181 -112.896
              vertex -87.0852 -296.215 -112.573
              vertex -87.1714 -295.916 -112.749
            endloop
        endfacet
        facet normal -0.987853 0.0260761 -0.153187
            outer loop
              vertex -86.8988 -294.403 -120.439
              vertex -86.7915 -294.399 -121.13
              vertex -86.8956 -294.772 -120.527
            endloop
        endfacet
    endsolid geometryplusplus

网格拓扑是什么?为什么不建议使用STL格式

网格本质上是曲面的一次逼近,它有两个核心的量:几何和拓扑。几何信息通过顶点位置来记录,而拓扑信息通过三角网格的连接关系来记录。曲面移出掉几何信息,就只剩下拓扑信息了。比如橡皮泥,你可以任意改变它的形状,只要不撕裂它,那么它的拓扑信息是不变的。所以,关于网格的计算,不仅需要几何的正确性,拓扑的正确性也是极其重要,却又是极容易被人忽略的。STL文件格式,其实并没有记录网格的连接关系,只是一群三角面片,有个英文名词叫triangle soup,说的就是这种格式。为了给STL格式的网格建立网格连接关系,常见的做法是把位置重叠的点融合成一个点。但是这种做法,也让STL格式不能表达带割缝的网格结构了。所以,不建议使用STL格式来存储网格。可以使用OBJ格式来代替它。


网格顶点数和面数的关系

拓扑学的欧拉公式描述了网格顶点,边和面之间的关系:V - E + F = X. 其中V是网格顶点数,E是网格边数,F是网格面数,X是网格的欧拉示性数,是一个拓扑不变量。在网格点数很多的情况下,有下面这个近似关系:E = 3 * F / 2, X = 0。带入欧拉公式后,有近似关系:F = 2 * V。注意,如果导入一个stl网格,并且没有做顶点融合,V = 3 * F。所以,根据顶点和面的数量关系,可以判断导入的stl是否做了顶点融合。


网格亏格

简单的讲,网格的亏格(g)就是网格上“环柄”的数量,如下图所示,球体亏格为0,环体为1......欧拉示性数X = 2 - 2 * g, 如果网格有洞,则X = 2 - 2 * g - b. 在网格UV展开中,需要将网格剪开成圆盘拓扑,需要至少g + 1刀。

genus
genus

可定向网格

每个三角面片都有一个定向,比如v0, v1, v2,如下图左所示。相邻边的定向如果是相反的,则为相容的。如果网格所有的定向都是相容的,则为可定向曲面,反之为不可定向曲面。莫比乌斯带是有名的不可定向曲面,它只有一面:一个人从某点出发,绕带环游一圈回来后,则站在了这点的背面。

mesh orientation
mesh orientation

拓扑修复是什么
  • 拓扑修复是指把网格的连接关系修复成流形结构。
  • 流形结构是指网格每一个点的邻域是圆盘拓扑结构,并且是单连通的。典型的非流形结构包括:边的邻面多于2个,点的邻域面是多连通区域,孤立点等。
  • 拓扑修复的主要原因是,很多网格算法对网格有流形结构的假设,如果网格不满足流形结构,算法有可能会失败。逆向软件里导入的网格,往往是第三方软件产生的,没有流形结构的保证,所以第一步处理就需要检测是否有非流形结构。

子网格的非流形结构

网格处理的时候,常常会遇到子网格结构,也就是部分网格。比如网格面片选择。这些子网格结构,有可能有非流型结构,比如某个顶点的邻域有多个连通区域。那么在编辑这些子网格的时候,要么编辑操作能与非流形结构相融,要么优化子网格区域,保证其流形结构。

有兴趣的读者,欢迎参考视频版本

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • STL文件是什么
  • 网格拓扑是什么?为什么不建议使用STL格式
  • 网格顶点数和面数的关系
  • 网格亏格
  • 可定向网格
  • 拓扑修复是什么
  • 子网格的非流形结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档