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 模式的各种产品形态进行了实践总结和理论升华.那到 ...
随机推荐
- MySQL InnoDB primary key根节点常驻内存
mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作.
- Numpy | 06 从已有的数组创建数组
numpy.asarray numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个. numpy.asarray(a ...
- 【题解】洛谷 P1449 后缀表达式
目录 题目 思路 \(Code\) 题目 P1449 后缀表达式 思路 栈.题目说的不是很清楚,没说包含什么操作.除法用整数除法就行. 先string读入字符串,然后从前往后看如果是个数字就入栈,如果 ...
- 关于wineQQ8.9.19983deepin23版本提升不能在使用请升级,Linux偷懒升级方法
安装wineQQ8.9.19983deepin23版本后提示,不在提供服务请升级. 第一步 前往QQ官方下载Windows最先版本QQ https://qd.myapp.com/myapp/qqtea ...
- MVC框架模式和Javaweb经典三层架构
一.MVC设计模式 1.MVC的概念 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(Vie ...
- 如何在Docker容器之间拷贝数据
[编者的话]在容器之间拷贝数据是Docker一个重要而且基本的功能.拷贝数据到其他容器是一个经常使用到的场景,如当服务器遇到不可预见的“灾难”(注:断电,宕机)时,起到备份数据的作用.本文作者详细介绍 ...
- hotspot的安全区(saferegion)和安全点(safepoint)
1.通过OopMap完成根节点枚举 HotSpot虚拟机使用可达性分析算法确定对象是否可以被GC. 可达性分析算法从一系列GCRoot对象开始,向下搜索引用链,如果一个对象没有与任何GCRoot对象关 ...
- Java8之list<entity>获取实体的某一字段
示例 List<String> titles = titleList.stream().map(e -> e.get(ConstantUtil.TITLE)).collect(Col ...
- Css3 文字渐变整理(一)
一.文本颜色渐变 <gradient> :可以应用在所有接受图像的属性上,允许使用简单的语法实现颜色渐变,以便UA在渲染页面自动生成图像. 语法:<gradient> = li ...
- base64加密后无法解密
记录一个问题: 使用java,或者命令行 base64 命令加密图片文件成加密数据后无法还原成图片 深入:使用java base64工具(sun base64或bouncycastle)加密的数据替换 ...