Lecture 12 Geometry 3

Mesh Operations: Geometry Processing

  • Mesh subdivision
  • Mesh simplification
  • Mesh regularization

①、Mesh Subdivision (upsampling)

Increase resolution

网格细分。通过增加三角形面数来得到更加平滑的效果。

②、Mesh Simplification (downsampling)

Decrease resolution; try to preserve shape/appearance

网格简化。当一个模型很复杂,但是我看这个模型的时候距离相距很远,那么看到的细节其实没有那么多,这时候就需要对网格进行简化,去掉一些边、三角形等,但是依然要维持原来的相互连接关系,不能破坏基本结构。

③、Mesh Regularization (same #triangles)

Modify sample distribution to improve quality

三角形大小不一,长短各不相同的模型,在渲染上可能会造成很多不便。这里做一个正则化,将原来的三角形正则成大小相同的正三角形,但是同时不能丢失细节。

(一)、Subdivision

1、Loop Subdivision

Common subdivision rule for triangle meshes

First, create more triangles (vertices)

Second, tune their positions

整个Loop细分分为两步,首先引入更多的三角形,然后再通过改变这些三角形顶点的位置来让整个模型看上去更光滑。

  • Split each triangle into four

取三角形三边的中点并相互连接,就将一个三角形分成了四个三角形

  • Assign new vertex positions according to weights

    ​ --New / old vertices updated differently

调整三角形顶点的位置。

将三角形的顶点区分为新的顶点和老的顶点,新的顶点即为新生成的顶点(上一步中取到的边的中点),老的顶点即为原来三角形的顶点。Loop细分将这两种不同类型的顶点,分别以不同的规则来改变他们的位置。

(Loop Subdivision并不是叫循环细分,发明这个细分方法的人的family name就叫Loop,所以就有了这个名字)

For new vertices:

Update to: 3/8 * (A + B) + 1/8 * (C + D).

对于新的顶点(如上图白色点),会被两个三角形所共享,将共享顶点所在的这条公共边两端的两个公共顶点分别定义为A、B,然后把这两个三角形非公共的两个顶点分别定义为C、D,然后将共享顶点(上图白色点)的位置调整为3/8 * (A + B) + 1/8 * (C + D)即可(这个式子其实就是一个简单的加权平均,A和B离共享顶点近一些,所以占的比例相对较大,而C和D离共享顶点远一些,所以占的比例相对较小)。

For old vertices (e.g. degree 6 vertices here):

Update to: (1 - n*u) * original_position + u * neighbor_position_sum

n:vertex degree

u:3/16 if n=3,3/(8n) otherwise

对于老的顶点(如上图白色点),周围的老顶点会对这个顶点有一定的影响。Loop细分规定这个要计算的老顶点(上图白色点)一部分受周围老顶点的影响,一部分保持自己的位置属性。在这里我们定义一个n,为顶点的度(这个顶点连接的边的数量),再定义一个u,这个u仅仅是一个与顶点的度有关的数。得到以下公式:(1 - n*u) * original_position + u * neighbor_position_sum。从这个式子可以看到,当顶点的度很大(连了好多三角形),那么这个顶点基本就可以由周围的老顶点决定位置,当顶点的度很小(连接的三角形很少),那么这个顶点由自己原来位置决定更新后位置的比重就会增大。

2、Catmull-Clark Subdivision (General Mesh)

刚刚的Loop Subdivision仅仅可以针对全部都是三角面的网格。而Catmull-Clark Subdivision适用于更普遍的情况,无论是四边面还是三角面都可以很好地进行细分处理。

首先我们定义Non-quad face,所有不是四边面的网格形状都被称作非四边形面。

其次我们再定义奇异点(极点),所有度不为4的点都被称为奇异点。

Each subdivision step:

①、Add vertex in each face

②、Add midpoint on each edge

③、Connect all new vertices

对于每一个面,首先取这个面中心的点,然后取这个面的各个边的中点,最后把边上的中点和面中心的点连起来。

如上图,即为经过Catmull-Clark细分后的样子。

After one subdivision:

How many extraordinary vertices? 共有4个奇异点

What are their degrees? 原来是度是5的奇异点现在的度还是5,新引入的奇异点由于要与三角面上的每一条边的中点相连,因此度为3

How many non-quad faces? 没有非四边形面了,全部都为四边形面(细分的过程中每一个非四边形面都会引入一个奇异点,然后非四边形面就消失了)

再次细分后,面会越来越光滑。

FYI: Catmull-Clark Vertex Update Rules (Quad Mesh)

Catmull-Clark细分后对点的位置的更新分三种:

第一种是对于面的中心点f的更新,第二种是对于边的中心点e的更新,第三种是对于老的顶点v的更新。公式如上图所示。

Convergence: Overall Shape and Creases

Loop Subdivision仅能用于三角形面的网格,Catmull-Clark Subdivision可以用于任何形状组成的网格。

(二)、Mesh Simplification

Goal: reduce number of mesh elements while maintaining the overall shape

How to compute?

不同情况下要用不同面数的模型,那么如何去计算对网格的简化?

Collapsing An Edge

  • Suppose we simplify a mesh using edge collapsing

这里提供边坍缩的方法。

边坍缩:形象的说明的话,即为一条边两端连着两个顶点,将这两个顶点往中间一捏,变成一个点,这个操作即为边坍缩。

Quadric Error Metrics(⼆次误差度量)

  • How much geometric error is introduced by simplification?
  • Not a good idea to perform local averaging of vertices
  • Quadric error: new vertex should minimize its sum of square distance (L2 distance) to previously related triangle planes!

如上图左图,假设要简化上面三个顶点,变成一个顶点,该把这个顶点放在哪里,才能保证简化后的蓝色三角形与原本灰色多边形基本保持轮廓的一致?这里引入二次误差度量概念:我们希望把这个顶点放某个位置上,可以最小化二次误差。在此处的意思就是:把这个顶点放置在某个位置上,使得这个顶点到各个面(如上图右图,在这里看上去像是边)的距离的平方和达到最小。

Quadric Error of Edge Collapse

  • How much does it cost to collapse an edge?

  • Idea: compute edge midpoint, measure quadric error

  • Better idea: choose point that minimizes quadric error

  • More details: Garland & Heckbert 1997

对于整个模型有很多条边,假设如果坍缩一条边,并且算出把这个坍缩后的点放在最佳的位置上会得到一个多大的二次度量误差。对于整个模型而言,每次肯定都是要坍缩二次度量误差最小的边。

Simplification via Quadric Error

Iteratively collapse edges

Which edges? Assign score with quadric error metric*

  • approximate distance to surface as sum of distances to planes containing triangles
  • iteratively collapse edge with smallest score
  • greedy algorithm… great results!

先给每个边打上一个分数,这个分数就是这个边的二次度量误差,从小的开始一个个进行坍缩。

但是问题是,如果坍缩了一条边,有一些其他的边的位置要跟着这条坍缩的边变化,那么这些边的二次度量误差就会随之发生变化。

因此这里我们要通过一种数据结构,既可以每次取到二次度量误差的最小值的边,又可以动态地以最小的代价去更新其他的受影响的元素。那么这里要使用的数据结构就是堆(优先队列)。

GAMES101-现代计算机图形学入门-闫令琪——Lecture 12 Geometry 3 学习笔记相关推荐

  1. GAMES101-现代计算机图形学入门-闫令琪——Lecture 05 Rasterization 1 (Triangles)

    GAMES101-现代计算机图形学入门-闫令琪--Lecture 05 Rasterization 1 (Triangles) 目录 GAMES101-现代计算机图形学入门-闫令琪--Lecture ...

  2. GAMES101-现代计算机图形学入门-闫令琪——Lecture 19 Cameras and Lenses 学习笔记

    Lecture 19 Cameras and Lenses 一.Camera 1.Pinhole Image Formation 最早的相机是从小孔成像开始的. 2.Important Parts ( ...

  3. 现代计算机图形学入门-闫令琪 17课基本材质

    日出效果:尘埃分解光线画面.水柱之间有透明渐变和表面起伏反射.洞穴中间的聚光线发生的反射.飘起的头发发生的反射.布料材质反射的光线不同.蝴蝶的鳞片起伏反射.光晕的效果是中间灰两边亮.鱼片的表面的次反射 ...

  4. GAMES101-现代计算机图形学入门-闫令琪 - lecture15 光线追踪3 - 辐射度量学、渲染方程(Ray Tracing 3) - 课后笔记

    光线追踪3 - 辐射度量学.渲染方程和全局光照 内容: 辐射度量学 光线传输(Light transport) 反射方程(The reflection equation) 渲染方程(The rende ...

  5. GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记

    光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...

  6. GAMES101-现代计算机图形学入门-闫令琪 - lecture9 着色3(Shading 3) - 课后笔记

    着色3(Shading 3) 重心坐标 纹理查询 纹理应用 插值 - 重心坐标 (Barycentric Coordinates) 为什么要插值? 能够获得三角形三个固定顶点的属性,但是不知道三角形内 ...

  7. GAMES101-现代计算机图形学入门-闫令琪 - lecture14 光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) - 课后笔记

    光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) 对AABB结构优化来加速光线追踪的速度 均匀网格(Uniform grids) 空间划分(Spatial part ...

  8. 一篇学完:GAMES101:现代计算机图形学入门 学习笔记

    文章首发于lengyueling.cn 欢迎访问交流! PDF版本已经附在lengyueling.cn文章末尾,需要自取. 导论 图形学应用场景 电子游戏: PBR:之狼 卡通渲染:无主之地 电影:黑 ...

  9. GAMES101现代计算机图形学入门-第一节-图形学导论

    最近在为之后找工作面试做准备,所以把大二学习的计算机图形学又拿出来重新学起来了,也推荐大家一起看闫大神的课!!! 然后笔记是在lengyueling大佬的版本上进行的修改,总体还是大佬的模板. 希望大 ...

  10. GAMES101现代计算机图形学入门——几何表示之曲线与曲面

    此为个人学习笔记,总结内容来源于网络各个平台,如有错误欢迎指摘 几何表示 曲线与曲面 本节附加资料: Making things with Maths (acko.net) 游戏开发技术杂谈2:理解插 ...

最新文章

  1. Android 自定义光标样式
  2. python画旺仔代码_美术生把旺仔牛奶画成抖音网红,看清画的是谁,网友:确认过眼神...
  3. python数据分析方法五种_加速Python数据分析的10个简单技巧(上)
  4. 云原生生态周报 Vol. 14 | K8s CVE 修复指南
  5. 全面理解ERC721的实现机制
  6. iOS开发UI篇—九宫格坐标计算
  7. SLB访问日志分析:基于客户端来源和HTTP状态码的实践
  8. Java 10新特性解密
  9. Android笔记 - 如何避免ActivityNotFound异常,查看Activity堆栈信息,获取进程名
  10. 一个while的小小问题
  11. Android4.4 Sensor APP--HAL代码流程
  12. 一个删除文件的批处理
  13. JAVA中String类型的字符替换问题
  14. 快速原型软件开发模式
  15. paurse java_在eclipse中通过RSE插件运行远程java程序时遇到问题
  16. 感时花溅泪,恨别鸟惊心
  17. 计算机网络:基础概念
  18. 5个能让你15T硬盘立马爆满的黑科技网站,让你在工作中技高一筹
  19. 优秀互联网高级测试工程师应该具备的能力
  20. 智能信息处理笔记 遗传算法

热门文章

  1. android开发找不到模拟器(PANIC: Could not open:)解决办法
  2. 可视化工具netron的使用
  3. word文档里怎么撤回上一步的操作
  4. PMOS和NMOS的区分及导通方式
  5. matlab 添加文本框textbox
  6. 漫谈TCP-AIMD/BBR的公平性以及buffer bloat
  7. koa教程--busboy模块
  8. 中国心率监测器行业市场供需与战略研究报告
  9. 基于单片机的脉搏心率远程监测
  10. PythonTkinter 练习11之 自编工具 扫描地址段IP