Geometry 曲面细分和曲面简化
Geometry 曲面细分和曲面简化
- 1 曲面细分
- a) Loop细分
- b) Catmull-Clark细分(Catmull-Clark Subdivision)
- 曲面简化
- 边坍缩
- 总结:
1 曲面细分
曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果,让物体更加趋近于真实世界.
三角形越多,模型越精确,产生的视觉效果更直观更好.
a) Loop细分
首先要介绍清楚,这个Loop细分并不是循环细分的意思,而是发明这个算法的人叫Loop.
Shout out to every bald man!
总而言之,Loop细分总体只做了两件事:
先细分(将一个三角形变成四个小三角形)
再调整个顶点的位置.
具体步骤如下:
1 细分:
通过连接三角形各边中心点,我们可以在一个大的三角形基础上,得到四个新的小三角形.
2 调整:
细分了之后我们要对现如今的各个三角形的顶点位置进行调整,从而产生平滑的过渡效果,显得不会突兀.
对于新老顶点我们要分别用不同的规则来调整:
- 对新顶点:
如图中的白点是通过细分后产生的一个新顶点,它一定在三角形的一条边上,只要这条边不是表示的边界,那么它一定会被不同的三角形所共享,比如图中白点所在的边就被上下两个大三角形所共享.
我们把这条共享边上的两个顶点叫做A 和 B,剩下的两个顶点叫做C 和 D,也就是四个黑点.
找到黑点之后,白点现在的位置就是3/8的(A和B的平均位置) + 1/8的(C+D的平均位置),也就是其位置为周围4个顶点的权重之和:
因为A,B两点离白点近,权值大,C,D两点离得远,权值小.至此我们得到了新顶点的位置.
对老顶点:
如图我们可以看到,白点是一个老顶点,他一共被六个大三角形共享,此时白点的位置一部分取决于其他相邻的老顶点,剩下的取决于自己的位置.在此我们要引入两个概念:n和u
n: 顶点的度,连接几条边就是几度,如图白点为6度
u:与度相关的一个数,如果是n = 3,那么y = 3 /16;如果n != 3,则u = 3 / 8n.(如图中白点的u应该是1/16).引入n和u是为了求出老顶点现在的位置:
一方面相信自己原本的位置: (1 - n * u) * 原本的位置
一方面想引自己周围老顶点的平均: u * 老顶点们的位置平均.
将他们一相加就得到老顶点现在的位置.
如果一个顶点连接了很多个三角形,例如连接了20个三角形,那么这时就可以忽略他自己的位置,只需要由周围20个三角形来决定自己的信息.
这是一个不断进行Loop细分的例子效果.
b) Catmull-Clark细分(Catmull-Clark Subdivision)
Loop细分针对是所有三角形面,但是现实中常用的网格不仅仅只有三角形网格,因此就有了Catmull-Clark细分,这里以四边形面和三角面的混合为例:
首先做一些定义:
1 我们定义四边形的面为quad face,对于所有不是四边形的面,称之为Non-quad face
2 所有度不为4的顶点称之为奇异点
(如图中紫色的点即为奇异点,因为这两个点的n为5)
定义完这两个概念之后我们来介绍如何细分的:
1.取non-quad 面中间附近的一个点
2.取non-quad 面上的每条边的中点处
3.将non-quad 面中间的点与边上的中点连接,生成了若干个新的quad face,从而达到了曲面细分的效果.
结果如下图所示:**
我们在经过一次细分之后:
1 有几个非四边形面,就会多出几个奇异点,所以现在一共有2+2 = 4个
2 新多出来的奇异点的度数与原来non-quad face的边数相等,如这里原non-quad face是三角形,新产生的奇异点就是3度
3 如果在第一次细分之后所有面都会变成四边形,不存在non-quad face,那么往后奇异点数目不再增加
如果此时我们再做一次细分,仍然不会增加奇异点:
可以看到奇异点依然是4个,不再改变。
以上我们明白了如何增加新顶点,与Loop细分类似,我们同样需要去调整各类顶点的位置,这里将所有的顶点分为三类:
face point
edge point
Vertex point
对于各类顶点位置调整如下图所示:
Loop细分 V.S Catmull-Clark细分:
曲面简化
曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术)
边坍缩
其实曲面简化所利用的一个方法叫做边坍缩,如上图所示就是将一条边的两个顶点合成为一个顶点。
但随之而来的问题就是,曲面简化需要尽量保持原本模型的形状,图中我们坍缩一条边,与之相连的边的也会发生改变,比如原先趋近于竖直的边现在趋近于平行,这些会导致模型的样貌变化.
因此坍缩哪一条边能够使得原模型样貌被改变的程度最小,这是曲面简化的关键所在。
为此我们引入一个度量,即二次误差度量(Quadric Error Metrics)
即坍缩之后蓝色新顶点所在的位置与原来各个平面的垂直距离之和,在此我们忽略如何求新顶点的位置,我们认为新顶点的位置是可求得.
如果能够使得这个二次误差度量值处于最小,那么在进行边坍缩之后,对整个模型样貌修改一定程度上也会较小,因此我们应该最先从这条影响最小的边进行坍缩.
那么其实到这整个曲面简化的算法流程已经比较清晰了:
1.我们对模型上的每条边进行赋值,其值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差度量
2.找到在所有边中二次误差度量最小的那条边做坍缩,新顶点位置为原来计算得出使得二次误差度量最小的位置
3.由于坍缩之后会引起与之相连的一些边的变化,因此要更新这些边的二次误差度量值,在坍缩之后重新计算这些边的二次误差度量并更新.
4.重复2 , 3 步步骤,直到到达终止条件.
这其实是一个标准的贪心算法,可能到不了全局最优解,但事实证明最终的结果依然相当不错
总结:
到此,几何部分就全部结束了,我们了解了显式和隐式几何,明白了贝塞尔曲线和贝塞尔曲面,也知道了曲面细分和简化的做法,下一章我们将进行关于闫老师的Ray Tracing部分,拖延症真的没救了…在好久就将几何部分的笔记写在了本上却一直没有更新电子档,加油,打工人,大家都在进步本来就已经落后于他人了更要勤奋.
“勤奋的人不一定是天才,但天才一定勤奋.”
Geometry 曲面细分和曲面简化相关推荐
- 计算机图形学【GAMES-101】5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...
- 曲面细分(subdivision)曲面细分着色器GPU的LOD
曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果 曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术) .这一过程是可以在 ...
- 图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
图形学笔记(九)几何 --几何表示方法(CSG.距离函数.水平集 .点云.网格(obj格式)).贝塞尔曲线(面) 图形学笔记(十一)光线追踪--Shadow Mapping.光线追踪.光线投射.软硬阴 ...
- Shader学习_曲面细分着色器
曲面细分 详细介绍 当然除了细分与简化之外,还有另外一种同属一类的操作叫做==曲面规则化(Mesh Regularization)==其所作的便是将三角面都变的尽可能相同,从而也达到提升模型效果的目的 ...
- Unity URP 曲面细分
Unity URP 曲面细分 我终于变得不像我 文章目录 Unity URP 曲面细分 1 曲面细分与镶嵌 1.1 外壳着色器 Hull Shader 1.2 镶嵌器阶段 Tessellator 1. ...
- 使用曲面细分渲染毛发
使用曲面细分渲染毛发 original link 几周前,我无意间找到了一篇让很有趣的论文,主要讲述的是使用曲面细分技术去渲染头发,并且是在Direct3D 11类型的GPU上.这是我多年前在曲面细分 ...
- UE4 置换贴图 曲面细分
== 使用曲面细分需要网格对曲面细分支持 == 效果 没有使用曲面细分 使用曲面细分 启用曲面细分 设置base Color和Normal 设置曲面细分系数和场景置换贴图 完成之后的效果,有容貌立起的 ...
- 曲面细分着色器学习记录
曲面细分着色器学习记录 前言: 今天终于走通了Catlike大佬的曲面细分着色器教程,感慨一番,自己的学习之路还很漫长呢 今天的博客内容只是简单的记录一下Catlike大佬的教程 先上个链接:Catl ...
- c++生成nurbs曲面文件_使用曲面细分丰富原始多边形
曲面细分 光栅化图形渲染管线下,还有一部分需要我们进行详细的说明.曲面细分不单可以细分图元(简单的Flat Tessellation),还可以生成曲面(PN-Triangles),这是流水线中其它阶段 ...
最新文章
- xilinx vivado烧录s29gl256p-bpi-x8
- vijos 1512 SuperBrother打鼹鼠
- 持续集成接口自动化-jmeter+ant+jenkins(一)
- LELE的RPG难题
- hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】
- 塔罗牌第五张是什么牌_塔罗牌四季牌阵:冬至将至,快来看看未来这三个月运势如何?...
- Nodejs留言板案例总结
- 查询mysql数据库中所有表名
- Docker 概念-1
- PHP水果店管理系统,赢通水果店管理系统A3专业版
- junit 单元测试插入操作事务回滚
- c++学习记录之多态
- 如何解决DMS的个人数据隐私问题?ToF技术路线在路上
- 【2014/10/28】Python string类型
- 新买的电脑是win11系统,找不到DirectX工具?教你如何操作打开
- 安Linux基础入门教程
- 基于51单片机无线门铃控制系统设计(毕设课设)
- 网易云课堂uni-app实战社区交友类app开发笔记
- 蓝奏云 php 协议,蓝奏云网盘最新协议完整版附一套网络验证
- 【Oracle】存储过程基本语法
热门文章
- 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
- BluePrism注册下载并安装-RPA第一章
- 基于FPGA的实时图像边缘检测系统设计(上)
- 免费卡路里计算机,动者卡路里计算器
- cannot open https //centos7.iuscommunity.org/ius-release.rpm. skipping
- 条码打印软件如何固定二维码的尺寸和位置
- 旅游风景区`web大作业 静态网页
- 乐优商城--服务(七) : 用户中心微服务(LyUserApplication)
- 计算机丢失gfsdk txaa,GFSDK_TXAA_AlphaResolve.win64.dll gta 5
- 设置文本过长时显示省略号