Mesh网格简化
Mesh简化算法:
1. 通过mesh简化,可以将一个多边形的网格A转化成另一个网格B
网格B相比A,有更少的三角形面、边、顶点。
2. 简化的过程是受到一定的约束的。会有一系列自定义的质量标准来控制简化的进行。这些质量标准是为了让简化后的网格尽可能和原来的网格有相差不大的质量。
3. Mesh简化往往都是迭代的,例如每一次移除一个顶点或者一条边。并且这一过程是可以反转的,也就是可以通过优化后的网格,恢复到原网格
主要的简化算法:
1. 顶点聚集(Vertex Clustering)。
按照我自己的理解大致概述下,就是将距离 (记作ε )一定范围内的顶点合并成一个代表顶点。
这种处理方式速度快,时间复杂度是O(n),n是顶点数量。(暂留疑问为什么是O(n))
当然缺陷也很明显,可能会出现一个三角形退化成一条线段甚至一个顶点的情况。
a) 聚集生成(Cluster Generation)
用一个大的方框囊括mesh,然后将这个大方框分割成一个个小空间(cells),确定一个数值 ε > 0,作为小空间的边长。然后将mesh映射到这个方框里
(上图白点黑线是原mesh,绿点是简化后的mesh顶点)
b) 选择代表顶点(Representative Vertex)
就是将一个小空间里的所有顶点合并,选一个代表顶点来表示(这个代表顶点不一定是原mesh中存在的顶点)
第一种选择方法:平均值
应该是将小空间内顶点坐标取平均,最后选取一个代表点vp
第二种方法:中值
应该就是取最靠近中间的顶点吧
第三种方法:Quadrics Error Metrics(QEM) 二次误差测算
具体QEM的处理方式在另一篇文章中记录,其中我也有很多疑惑的地方,但还是简单的梳理了一遍
“QEM是一种误差度量,表示一个顶点到理想点的距离”,
按照我的理解就是,在一个小的空格(前面提到的cell)里,有多个顶点存在(共n个,v1~vn),最终我们需要选择一个代表点vp ,
对于每个顶点,都计算一次用vp代替vi的二次误差;最后再将这n个二次误差加和Esum。而我们的任务就是找到一个合适的点Vp,使得Esum最小。
上述三种方法的效果如下:
c)网格生成(Mesh Generation)
经过上面步骤的处理,每个小空间(cell)中都会最多有一个代表点vp
假设有两个cell,记作Cella和Cellb,其代表点为vpa,vpb;
Cella中的顶点集合为{p1,p2, ..., pn},Cellb中的顶点集合是{q1,q2, ..., qm},如果存在连线<pi, qj>,就将vpa,vpb连接
d)拓扑结构改变(Topology Changes)
(这张图就可以看出上面提到的缺陷)
2. 增量式减少(Incremental Decimation)
a) 思路如下:
- Repeat:
- pick mesh region
- apply decimation operator
- Until no further reduction possible
针对一个网格区域,找到所有简化的方法(每种简化方法后都会生成一个新的网格区域)
然后(有错误评估值的控制,偏差超出范围的简化方案不做考虑):
- For each region
- evaluate quality after decimation
- enqueue(quality, region)
- Repeat:
- get best mesh region from queue
- if error < ε
- apply decimation operator
- update queue
- Until no further reduction possible
对每个简化后的网格区域进行偏差评估,然后放入一个队列;
取出最优项(未完成)
b) 简化处理方法(Decimation Operators)
包括顶点移除(Vertex Removal)、边去除(Edge Collapse)、Half-Edge Collapse(不知道怎么翻译了)
这几种处理方法看图解很清晰,不加赘述
c) 误差度量(Error Metrics)
分为局部误差度量和全局误差度量
局部误差度量,按我理解的是,对 简化处理导致平面减少 这一情况进行度量
全局误差度量,计算简化处理后的网格区域误差值(未完成)
d) Fairness Criteria (按照我的理解,指的是简化过程中需要注意的约束标准,一下几点具体解释都是我自己的推测)
合理的误差——简化处理导致的误差不能过大(似乎有点像废话)
三角面的形状——三角面的形状变化不能过大
3. 两种方法的比较
Vertex Clustering
a) 顶点聚集时间复杂度O(n),处理速度快;但是简化过程难以控制(暂留疑问)
b) 拓扑结构(可能)会改变,(可能)会出现非流行网格
Increment Decimation
a) 在网格质量和简化速度之间有很好的平衡(暂留疑问)
b) 对网格的拓扑结构有明确的控制
c) 限制法向量偏差提升了网格质量
4. 参考
http://graphics.stanford.edu/courses/cs468-10-fall/LectureSlides/08_Simplification.pdf
https://pages.mtu.edu/~shene/COURSES/cs3621/SLIDES/Simplification.pdf
Mesh网格简化的更多相关文章
- unity Mesh(网格)的使用
创建两个三角形合成的矩形网格: GameObject obj= new GameObject(); MeshRenderer meshRenderer=obj.AddComponent<Mesh ...
- 关于Unity中Mesh网格的详解
3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...
- Axiom3D:Ogre中Mesh网格分解成点线面。
这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...
- Unity通过脚本创建Mesh(网格)
##1.创建一个带Mesh的物体 Unity中的网格作为组件不能脱离物体单独存在 新建脚本CreateMesh public class CreateMesh: MonoBehaviour { voi ...
- Unity3D学习笔记——游戏组件之Mesh(网格组件)
Mesh:网格组件.主要用于设置外形和外表. Mesh Filter:网格过滤器.就是为游戏对象添加一个外形. 例:设置外形为Sphere 如果获取的网格拥有蒙皮信患,Unity将自动创建一个skn ...
- Unity3D学习笔记——组件之Mesh(网格)
Mesh:网格组件.主要用于设置外形和外表. Mesh Filter:网格过滤器.就是为游戏对象添加一个外形. 例:设置外形为Sphere 如果获取的网格拥有蒙皮信患,Unity将自动创建一个skn ...
- Wi-Fi Mesh网络技术
Wi-Fi在很早的时候就引入了mesh技术,并且最近得到了越来越多的关注.谷歌.Eero.Linksys.Netgear以及几乎所有以家庭和小型办公室为目标的网络品牌都提供了mesh网格系统.但是也有 ...
- threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸
这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
随机推荐
- (尚034)Vue_案例_数据存储优化(代码优化!!!)
最好能将上述代码抽取成一个模块(读json数据+写json数据) 1.在src下新建文件夹util(util文件夹用于放入工具的模块) 2.*使用localStorage存储数据的工具模块* 一个模块 ...
- foreach中的collection
foreach中collection的三种用法 https://www.cnblogs.com/xiemingjun/p/9800999.html foreach的主要用在构建in条件中,它可以在SQ ...
- xss、SQL测试用例小结
xss测试用例小结: <script>alert("跨站")</script> (最常用)<img scr=javascript:alert(&quo ...
- 【AtCoder】 ARC 101
link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...
- vs2017添加区域或者视图出错
删除以下文件的信息:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files
- ConcurrentHashMap 无锁读
ConcurrentHashMap 可以做到无锁读,而写使用分段锁机制,把整个哈希表切分成段segment(默认为16段),每段有一个锁,最多可以同时有16个写线程.而读不受限制. 下文转自http: ...
- Spring Cloud Zuul 概览
什么是API网关 网关这个词其实是一个硬件概念.因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起.在家庭网络 和小型企业中,宽带路由器通常充当网络网关.它将 ...
- 投稿SCI杂志 | 如何撰写cover letter | 如何绘制illustrated abstract
现在大部分学术期刊杂志都要求提供这两样东西. 一个是面向editor的文章和研究的高度总结:一个是面向读者的高度总结,一图胜千言. 如何制作动画摘要呢? 收集素材,大部分内容在PPT里就能完成. 如何 ...
- Tomcat 9 管理界面配置
Tomcat9 在conf/tomcat_user.xml配置后,还是出现如下错误 然后修改tomcat9/webapps/manager/META-INF的context.xml文件
- JAXB xml序列化应注意
使用JAXB将对象序列化为XML时,发现有一个地方性能非常低,即 JAXBContext.newInstance(XXX.class); 建议将其提前创建好并作为变量保存,到时可直接使用其引用,而非重 ...