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 模式的各种产品形态进行了实践总结和理论升华.那到 ...
随机推荐
- 使用Map文件查找崩溃信息
简介 编写整洁的应用程序是一回事.但是当用户告诉你你的软件已经崩溃时,你知道在添加其他功能之前最好先解决这个问题.如果你够幸运的话,用户会有一个崩溃地址.这将大大有助于解决这个问题.但是你怎么能用这个 ...
- 如何保证最少消费一次redis的list队列数据
简使用pop,不能保证最少消费一次,比如pop超时可能中途丢失,或者消费者处理过程中异常而未能处理完. 解决此问题有多种方法: 1) 方法一:使用rpoplpush替代pop 这种方法相当于建立了一个 ...
- 洛谷 P3371【模板】单源最短路径(弱化版)
题面 既然是模板, 那就直接贴代码? 两种思路 1.迪杰斯特拉 #include <cstdio> #include <cstring> #include <iostre ...
- SSL证书创建与部署
SSL证书简介SSL证书创建SSL证书部署-NginxSSL证书部署-ApacheSSL证书部署-Tomcat SSL简介以及发展SSL协议原理SSL应用场景 SSL简介以及发展传输层安全性协议,以及 ...
- ImportError: cannot import name 'DjangoSuitConfig'
pip3.6 install https://github.com/darklow/django-suit/tarball/v2
- JVM探究之 —— 类加载过程
1. 类加载是什么 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连 ...
- MySQL Unknown table engine 'FEDERATED''
Last_SQL_Error: Error 'Unknown table engine 'FEDERATED'' on query. 错误 解决过程: 1.查看当前支持的存储引擎 show en ...
- 批量实现ssh免密登录
本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们 ...
- java中ExecutorService使用多线程处理业务
ExecutorService executorService = Executors.newFixedThreadPool(5); List<CancelApprovalCallable> ...
- PHPUnit 单元测试教程
一.官网下载对应 PHP 版本的代码库 https://phpunit.de/getting-started-with-phpunit.html 二.安装 PHPUnit 官网提供了两种方法安装 1. ...