从STL文件到网格拓扑

原文链接

STL文件是什么

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

    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刀。


可定向网格

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


拓扑修复是什么

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

子网格的非流形结构

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

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

原文地址:https://www.cnblogs.com/threepark/p/11736055.html

时间: 2024-08-02 05:40:21

从STL文件到网格拓扑的相关文章

使用WebGL实现一个Viewer来显示STL文件

关键字:WebGL,STL,ThreeJS,Chrome,Viewer,Python3.4, HTML5,Canvas. OS:Windows 10. 本文介绍如何使用ThreeJS来实现一个WebGL的Viewer,用来浏览STL文件. STL 文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式. 它的文件格式非常简单, 应用很广泛. STL是最多快速原型系统所应用的标准文件类型.STL是用三角网格来表现3D CAD模型. 1.新建一个STL.html文件如下: <!DOCTYPE

基于PLY的STL文件基本信息统计方法

1.摘要 STL文件是快速成型设备中常用的文件格式,随着3D打印技术的发展,STL格式文件的应用日益广泛.Python语言具有丰富和强大的类库,其语言简洁而清晰,因而Python语言越来越受欢迎.PLY是具名的LEX.YACC的Python版本,本文介绍了利用PLY模块对STL文件进行基本信息统计. KeyWord:PLY.语法分析.词法分析.STL 2.简介 计算机语言是计算机软件的系统的基础,经过几十年的发展,实现了从低级语言到高级语言的转变.原始的机器语言,到低级的汇编语言,它们虽然可以运

打开本地STL文件并创建webgl使用的geometry

需求 打开本地STL文件 一个独立基于webgl的viewer,会被别的网站重用 将打开文件的数据传输给viewer,并且在文件加载的时候显示进度条 解决方案 #1可以使用传统的html5 api来打开, #2来说,可以通过iframe来提供独立的viewer, #3来说需要用web worker来实现. 实现细节 数据的流向是网站的main page->iframe中viewer的main page->web worker->iframe的main page 刚打开的数据类型是buff

读取STL文件模型

STL是CAD软件中出来的一种3D模型文件格式,wiki已经解释的很清楚了. STL文件两种格式,ASCII STL和Binary STL. ASCII STL,每一个facet由7行数据组成,outer loop后面三个顶点的顺序沿法线矢量逆时针排序,格式如下: solid name // 文件名及文件路径 facet normal ni nj nk // 三角形法向量的三个分量 outer loop vertex v1x v1y v1z // 第一个顶点坐标 vertex v2x v2y v

使用 Materialise magics 对 STL文件进行切片

我们在3D打印中常用的STL文件怎么转换成sla打印机需要的slc文件呢? 无疑我们需要一款切片软件,那就是Materialise magics了 Materialise magics 这款业内领先.针对增材制造而打造的通用数据准备和STL编辑软件具备STL文件格式转换.修复.设计编辑.打印平台准备等多项功能.赶快准备好您的3D打印模型吧! 使用Materialise magics对STL切片 如图所示是你下载好的Materialise magics软件 新建平台 加工准备 --> 新建平台 新

将.stl文件转化为.dae并动态加载到SceneKit显示(ios中显示3d模型)

ios8之后苹果推出了一个3D模型渲染框架.SceneKit.但是国内针对这方面的教程并不是很多.前两天搞了一下也是一头雾水,终于把最基础的内容搞明白了之后,写下这篇随笔作为cnblogs的开篇,希望能一直写下去. SceneKit现在可以支持有限的几种模型,截止到我写这篇文章为止似乎只有.dae和.abc后一种模型我没有使用过.这篇文章只针对.dae模型写. 首先如果是希望加载一个已有的,不需要程序在运行的时候动态添加的dae模型.那么我们可以直接新建一个game类型的工程.在选项中选择Sce

opengl 读取stl文件

没有解决: mark 几个网站: 1 http://blog.csdn.net/icebergkevin/article/details/18974235 能实现二维的 2 http://www.cnblogs.com/xds1224/p/3565280.html 编译一直出现问题 现在还没搞定??? 3 http://blog.csdn.net/cracent/article/details/51049246 最后的代码有问题. 我下载的 MFC_Graphics 可以运行 但是没有渲染效果

创建、加载高级网格和几何体

1.对象合并 使用THREE.Group对象作为组合对象,调用它的add函数附加其他几何体.如下面的代码,创建了两个几何体sphere.cube,然后调用group的add函数,把两个几何体组合在一起.代码中的redraw函数在最后调用了position.BoundingBox()函数,用来定位组合体对象的位置.在positionBoundingBox函数中调用了setFromeObject并且返回了一个THREE.Box3对象.这里先不介绍这个对象,直接看后面的代码,通过box.max和box

STL空间配置器那点事

STL简介 STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合. 谈及组件,那么我们就首先来简单谈下STL六大组件,其相关的设计模式使用,以及各组件之间的协作关系. 设计模式一览 六大组件简单介绍 1. 空间配置器:内存池实现小块内存分配,对应到设计模式--单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由