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网格简化的更多相关文章

  1. unity Mesh(网格)的使用

    创建两个三角形合成的矩形网格: GameObject obj= new GameObject(); MeshRenderer meshRenderer=obj.AddComponent<Mesh ...

  2. 关于Unity中Mesh网格的详解

    3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...

  3. Axiom3D:Ogre中Mesh网格分解成点线面。

    这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...

  4. Unity通过脚本创建Mesh(网格)

    ##1.创建一个带Mesh的物体 Unity中的网格作为组件不能脱离物体单独存在 新建脚本CreateMesh public class CreateMesh: MonoBehaviour { voi ...

  5. Unity3D学习笔记——游戏组件之Mesh(网格组件)

    Mesh:网格组件.主要用于设置外形和外表. Mesh Filter:网格过滤器.就是为游戏对象添加一个外形. 例:设置外形为Sphere  如果获取的网格拥有蒙皮信患,Unity将自动创建一个skn ...

  6. Unity3D学习笔记——组件之Mesh(网格)

    Mesh:网格组件.主要用于设置外形和外表. Mesh Filter:网格过滤器.就是为游戏对象添加一个外形. 例:设置外形为Sphere  如果获取的网格拥有蒙皮信患,Unity将自动创建一个skn ...

  7. Wi-Fi Mesh网络技术

    Wi-Fi在很早的时候就引入了mesh技术,并且最近得到了越来越多的关注.谷歌.Eero.Linksys.Netgear以及几乎所有以家庭和小型办公室为目标的网络品牌都提供了mesh网格系统.但是也有 ...

  8. threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

随机推荐

  1. Python 10 训练模型

    原文:https://www.cnblogs.com/denny402/p/7520063.html 原文:https://www.jianshu.com/p/84f72791806f 原文:http ...

  2. [Java] Spring boot 的 SrpingSecurity 框架搭建

    参考: SrpingSecurity]之一:框架搭建https://blog.csdn.net/qq_28296925/article/details/82021092 [SpringSecurity ...

  3. [RN] React Native 打包时 减少 Apk 的大小

    React Native 打包时 减少 Apk 的大小 主要有两个方法: 在打包前设置 android\app\build.gradle 文件中 1) def enableProguardInRele ...

  4. [Zjoi2006]三色二叉树(bzoj1864)(洛谷2585)题解

    原题地址:https://www.luogu.org/problemnew/show/P2585 题目大意:可以把一个节点染成三种颜色,父节点和两个子节点(可以有一个)颜色不能相同.求最多(少)能有多 ...

  5. 第4组 Alpha冲刺(1/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(1/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.安排好各个组员的任务 2.收集各个组员的进度 3.写页面 4.写博客 展示Gi ...

  6. GoCN每日新闻(2019-11-11)

    GoCN每日新闻(2019-11-11) GoCN每日新闻(2019-11-11) 1. Go的内存管理与回收 https://medium.com/a-journey-with-go/go-memo ...

  7. linux运维 技能 2018

    1.监控与日志 prometheus.grafana.zabbix ELK(elasticsearch logstash filebeat kibana) 2.容器类 harbor映像管理 docke ...

  8. CAP原则 (阿里)

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance).CAP 原则指的是,这三 ...

  9. 【Beta】Scrum meeting 6

    目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit记录截图 小程序前端仓库 后端代码仓库 技术博客 写在前面 例会时间:5.10 22:30-22:50 例会 ...

  10. asp.net core 托管到windows服务,并用iis做反向代理

    使用NSSM把.Net Core部署至 Windows 服务   为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.n ...