文章目录
Loop Subdivision(三角形细分)(一个叫loop的人实现的)
Loop Subdivision主要是针对三角形(只局限于三角形) 让平面上的三角形细分成更小的三角形 从而使平面更加细致
为了让整个物体从左图变成右边更圆滑的图 需要新增细化三角形 并且改变新老顶点的位置
如何新增顶点
白色新顶点的位置更新如图所示
虚线处的顶点为新顶点 黑色的点为老顶点 一般是在每两个点中间新增一个新顶点 而新顶点的位置会根据老顶点的位置更新
如何跟新老顶点位置
n是老顶点的度:顶点连接边的数量
如图中白色定点为老顶点 他在细化的时候需要根据和他有关的其他点的位置发生变化 图中白色的老顶点就需要更具其他六个u点更新位置信息
老的顶点不受新顶点的影响 老顶点的变化他一部分相信自己的位置 一部分相信他周围老顶点的位置
(但是貌似。。。我感觉并不是老师说的这个老顶点的变化和度的多少有关(老师说的如果和该老顶点有关的顶点多 他就更相信其他的顶点一些 如果少就更相信自己一些) 从图中式子来看 感觉都是相信自己5/8。。可能没看懂u是多少)
Catmull-Clark Subdivision(网格细分)
网格细分不再局限于三角形了
奇异点:度不为4的点
如何新增顶点
在每个老顶点的中间新增一个点 并且在每一个面中间新增一个点
在图中我们能看到原来的奇异点还是奇异点没变 但是在非四边形的内部新增了一个奇异点 并且所有的非四边形都变成四边形面了 所以我们得出:在细分之后 老的奇异点不会消失 并且在每一个非四边形内部会多一个奇异点 此时非四边形面也会被细分成四边形面(以后奇异点数量就不会再增加了(也就是没有非四边形面了))
如何更新顶点位置
边坍缩(简化模型)
看起来就像拿住边两边的那个点 一捏 就是右边的图了
如何坍缩一条边
如果我们把想要坍缩的点做一个平均 就会像左图一样 明显不是我们要的效果
所以我们使用右图中的二次度量误差
什么是二次度量误差
二次误差度量:求一个点到他要度量的那几个点的距离的平方和达到最小(如上图的右边那个)
我们该选择哪条边进行坍缩
我们肯定选择二次度量误差最小的边进行坍缩 所以我们对每一条边都进行二次度量误差 把这个度量误差当作这条边的分数(权值)然后选取分数最低的进行坍缩 但是我们会发现我们坍缩了一条边之后 会影响到其他与坍缩的边相关的边的度量误差值 所以我们需要一个数据结构能取出最小的那个值 然后更新部分与这个值相关的值 所以
当我们选择坍缩时:使用优先队列或者堆存储每条边的二次度量误差 然后选取取出最小的值进行坍缩 再更新与之相关的其他边的二次度量误差值