从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个,点的邻域面是多连通区域,孤立点等。
- 拓扑修复的主要原因是,很多网格算法对网格有流形结构的假设,如果网格不满足流形结构,算法有可能会失败。逆向软件里导入的网格,往往是第三方软件产生的,没有流形结构的保证,所以第一步处理就需要检测是否有非流形结构。
子网格的非流形结构
网格处理的时候,常常会遇到子网格结构,也就是部分网格。比如网格面片选择。这些子网格结构,有可能有非流型结构,比如某个顶点的邻域有多个连通区域。那么在编辑这些子网格的时候,要么编辑操作能与非流形结构相融,要么优化子网格区域,保证其流形结构。
有兴趣的读者,欢迎参考视频版本
从STL文件到网格拓扑的更多相关文章
- 使用WebGL实现一个Viewer来显示STL文件
关键字:WebGL,STL,ThreeJS,Chrome,Viewer,Python3.4, HTML5,Canvas. OS:Windows 10. 本文介绍如何使用ThreeJS来实现一个WebG ...
- jt格式文件与网格压缩
jt格式文件与网格压缩 介绍 jt是一种3D数据格式,主要用于工业,产品可视化,数据交换,并且西门子在2012推动jt成为ISO国际标准.在文件尺寸方面,采用了不少专门的压缩方法,比较轻量化. jt文 ...
- 打开本地STL文件并创建webgl使用的geometry
需求 打开本地STL文件 一个独立基于webgl的viewer,会被别的网站重用 将打开文件的数据传输给viewer,并且在文件加载的时候显示进度条 解决方案 #1可以使用传统的html5 api来打 ...
- 3D Slicer中文教程(八)—导出STL文件
一.STL文件简介 STL(立体平版印刷术的缩写)是由3D Systems创建的立体平版印刷CAD软件原生的文件格式STL有“标准三角语言”和“标准镶嵌语言”等几个事后回溯.这种文件格式是由许多其他软 ...
- 与STL文件相关的各类学习地址
几个网址: 1.STL :https://en.wikipedia.org/wiki/STL_(file_format)#ASCII_STL 2.一个博客的文章地址: 三维图形数据格式 STL的 读取 ...
- NX二次开发-UFUN将实体放入STL文件中函数UF_STD_put_solid_in_stl_file
NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...
- NX二次开发-UFUN打开二进制STL文件函数UF_STD_open_binary_stl_file
NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...
- NX二次开发-UFUN关闭STL文件函数UF_STD_close_stl_file
NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...
- opengl 读取3ds(stl)文件
没有解决: mark 几个网站: 1 http://blog.csdn.net/icebergkevin/article/details/18974235 能实现二维的 2 http://www.cn ...
随机推荐
- Junit(手动/自动)加载
ssm中测试service层数据 Junit手动加载配置文件 package com.oukele.bookshop_ssm.service; import org.junit.After; impo ...
- springboot2.x下actuator模块
一.简介 spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态和可用性.Spring Boot的s ...
- 第一篇【Zabbix服务端的完整布署】
1.环境准备 服务器版本: [root@filestore-v2 ~]# cat /etc/redhat-release CentOS Linux release (Core) 内核版本: [root ...
- Confluence 6.15 使用附件宏
希望添加附件宏到一个页面中: 从编辑工具栏中,选择 插入(Insert) > 其他宏(Other Macros) 找到并且选择需要的宏. 可用使用自动完成加快这个过程:输入 { 然后开始输入 ...
- CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)G
题面 一道暴水的dp....别问我为什么直接打开了G题,我只是对题目名称感兴趣而已.... #include<bits/stdc++.h> #define ll long long usi ...
- bootstrap列表组的使用
<ul class="list-group"> <li class="list-group-item"> <div class=& ...
- 8.4 JavaScript(一)
参考链接:http://how2j.cn/k/javascript/javascript-javascript-tutorial/519.html 一.JavaScript是什么 JavaScript ...
- Robotframework之SSHLibrary库
Robotframework之SSHLibrary库 使用robotframework做自动化测试,在流程中可能需要远程连接机器做一些简单操作,比如连接linux服务器,外面平时用的工具去连接 ...
- 互操作性 a C++ library which enables seamless interoperability between C++ and the Python programming language
https://zh.wikipedia.org/wiki/互操作性 就软件而言,互操作性——这条术语用来描述的是不同的程序(programs)借助于同一套交换格式(exchange formats) ...
- 本地oracle可以通过localhost连接,无法通过ip地址连接解决方法,oracle远程连接配置
Oracle11g安装后只有本地可以连接,远程无法连接,而且本地只能配置成localhost配置成IP地址也无法连接. 这是因为安装oracle的时候没有配置远程的监听,默认的监听是localhost ...