从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 ...
随机推荐
- BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
- Java开发工具汇总
1. Arthas 是Alibaba开源的Java诊断工具 Java动态追踪,对生产环境出现出现bug的情况下,无法调试处理问题,可以借鉴该工具进行问题分析. 原理介绍:Java动态追踪技术探究 Ar ...
- App 仿淘宝:控制详情和购买须知样式切换,控制商品详情和购买须知选项卡的位置(固定在顶部还是正常)
CSS: <div id="details" ref="details" class="details" :class="t ...
- python 通过序列索引迭代
另外一种执行循环的遍历方式是通过索引,如下实例: #!/usr/bin/python # -*- coding: UTF-8 -*- fruits = ['banana', 'apple', 'man ...
- js 获取 touch length
window.addEventListener("touchstart", touchHandler, false); function touchHandler(event){ ...
- OI路上 day -9
/* 嗯还有9天. 就只有9天了. 啊还剩9天吖! 多年后 我可能还会记得 那些年,我们学过的算法. 多年后 我可能会对别人说 我学过OI我喜欢OI并一直热爱着它. 9天后 我可能再也不会来到这个地方 ...
- python测试网站访问速度
# -*- coding: utf-8 -*- # @Author : Felix Wang # @time : 2018/8/13 22:13 # pip3 install pycurl impor ...
- 使用Telnet访问端口发送数据
什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...
- 快速理解arguments对象
在js中一切都是对象,连函数也是对象,函数名其实是引用函数定义对象的变量. 1.什么是arguments? 这个函数体内的arguments非常特殊,实际上是所在函数的一个内置类数组对象,可以用数组的 ...
- tp5 多条件查询
$where['rc_category_id'] = array('eq',$cid); $where['rc_territory_ids'] = ['like', '%'.$tid.'%']; $l ...