Polygon Mesh Processing 读书笔记

来源:互联网 发布:制作h5的软件 编辑:程序博客网 时间:2024/06/06 02:57

引子:

一直都在被赶着到处乱跑的感觉~但是无论如何,做事的时候都要沉下心认真去做。自己对自己负责。

 

第一章:表面表示方法

几何处理一直是对几何模型应用算法。如果算法代表“动作”,那么几何结构就是“物体”。在这一节我们将会讨论几何结构的不同数学表示。尽管这些表示可以是2D/3D的,我们实际要处理的总是3D固体的表面。我们将在全书中的每个问题看到这一点。我们可以定义一个操作的集合,其中计算量是占主导因素的。所以我们必须要选择合适的表示方法,这样才能高效地实现这些算法。

高屋建瓴地看,表面表示法有2大类:参数表示和隐式表示。参数化的表面可以被定义为参数化的方程转换的一组向量值。f代表从omiga到S的映射,将2D的参数域omiga - R2映射到表面S - R3.而隐式曲面表示法则被定义为具有标量值的函数F的零集,将三维的曲面S映射为一维。
//个人理解,参数表示为2D的,隐式表示为1D的。这个很显然。不过零集zero set是神马东东,是所有满足F = 0的点吗

为了更好地说明,我们可以类似地定义参数化表示的曲线。f:omiga->C,其中omiga是1维的,[a,b]。一个相应的隐式定义则只对平面曲线管用。如C = {x 属于 R2 |F(x) = 0},F从二维映射到一维。一个简单的2D例子是单位圆。它的参数表示为

隐式方程的核为:

同样,在3D中,一个求可以用参数或隐式方程表示。

对更复杂的形状,用单个显式方程表示是很难的,精度也不够。因此,函数域被分为更小的子区域和各自的函数(曲面块),对每个分割进行自己的定义。这样每个函数只需要近似自己局部的形状即可。全局的近似则由分块的大小和数目决定。数学上的挑战是确保每块和它的相邻块的衔接是连续的。在参数表示中,最常用的分块定义是将块分为三角形或四边形。对隐式定义来说,嵌入空间往往被分为六面体体素或四面体单元。

参数表示和隐式表示都有各自的优缺点。要根据几何问题选择合适的方式。为了分析几何操作和它们对表示方法的需求,我们将他们分为以下三个类别:
1 评估。这需要对几何或其他性质(如法向量场)进行采样。一个典型的应用时表面绘制。
2 查询。空间查询用来判定一个点p是否在固体内部还是外部。这对建模来说很关键。另一个典型的查询时计算点到表面的距离。
3 修改。表面的修改可以是几何修改(表面变形)或拓扑修改(如不同部位被融合、切割或删除)

参数表示和隐式表示有着互为补充的优点。如,其中之一的高效或鲁棒往往是另一个的缺点。因此,对每个特定的几何问题,选择更合适的表示方法往往要求2者的有效转换(见1.5)。在1.6中我们将展望结合2种表示的方法,来设计更好的算法。

1.1 表面定义和性质

普通的对表面的定义是在计算机图形学中的应用:“内嵌在R3中方向连续的2D流型”。直觉上,这可以理解为一个non-degenerate的3D固体,其中non-degenerate表示固体不能有任何无限细小的部分或细节使得表面能正确区分“内部”和“外部”一个有边界的表面可以通过填补空洞来扩展为正确的流型。
//个人理解:一个实体的2个部分不能只有一个点或一条边相接。要有一个3D的空间连起来

在大多数情况下,输入表面是由一些离散的采样点组成的。首先我们要建立一个数学上连续的表面表示。这要求我们在采样之间建立连续的邻居关系。由此,连续意味着采样区域流型表面存在。

测地线意义上的邻居(而非空间邻居)对于隐式表面而言很难提取,但在参数意义上却相当容易:如果2个点在omiga域内相近,则认为它们测地意义上相邻。这样我们可以导出一个局部流型:一个连续的参数表面在p点是局部流型,只需要满足:对每个在p附近delta半径球体内的q点,对应的pre-image的点包含在以delta为半径的圆上。一个更直观的表述是:p的附近delta半径球内的店是拓扑相等的。第二个定义无需参数化,因此它也适用于隐式表示。

 

 跳着看了

第五章 参数化

5.1 参数化
什么叫参数化:3D <--> 2D一对一表示

5.2 三角网格参数化
x(u, v) = a*pi + b*pj + r*pk

5.3 重心映射

 

 

第九章 网格变形技术 

在这一章中我们将介绍对给定三角网格进行交互性地变形。这一课题的挑战性在于用户直觉背后的复杂的数学公式,以及充分有效的实施。这一章对不同变形技术进行了综述,将它们分为几个不同的类别,并展示了它们的关系。
将给定表面S变形为S',在数学上的表述为每个点p的位移函数d,这样它将给定S->S'
S' = {p + d(p) | p belongs to S}
对一个离散的三角网格,位移函数d是分段线性的。它有由原网格顶点pi定义
di = d(pi)
用户可以通过控制一系列控制点p belongs to H belongs to S的位移来控制变形。同时,还需要加上一些特定部位的约束F belongs to S,来在变形过程中维持不变。
d(pi) = di_given ,当p属于H
d(p) = 0 ,当p属于F
这样,给定H中控制点的位移和F中的不动点,剩余点R的位移d即为我们要解决的问题。

我们将讨论2类变形方法:
1 基于表面的变形(9.1到9.4节)
d: S -> R3 由原S表面计算得出
优点:控制的自由度很高
缺点:鲁棒性和效率受网格质量影响。

2 空间变形
d: R3 -> R3 将整个嵌入空间进行变形
不需要计算三角网格,不被S的复杂性所影响

所有我们讨论的变形技术都是线性变形技术,也就是说,他们要求的解法是线性方程,一般都是最小化一些二次变形能量函数。优点就是可以被有效地解出来。然而,这些方法对大规模的变形只能求出违背直觉的解,如9.7节展示的那样。非线性变形技术克服了这些限制,它们最小化的是更精确的非线性能量,然而,这会涉及更复杂的数值解。我们将会在9.8节提到一些。

 

9.1 转换传播

 

一个简单又流行的变形方法是将用户定义的控制点的变换传播到其他点上。在确定完变形的R区域和控制区域H后,H的变换T(x)在R区域被传播和衰减,使得H区域和F区域平滑融合。

这一平滑的融合由一个标量场控制s[0,1],当s为0表示F区域,无变换;s为1为H区域,全变换。s介于0、1之间为平滑融合。一个建立该标量场的方法就是:计算点p到F区域和S区域的距离,定义s(p)为
s(p) = distF(p)/( distF(p) + distH(p) )
其中,距离函数可以为测地距离或欧式距离。前者的结果更好,但也更难算。

另外,标量场也可以用表面的谐波场来计算。加Dirichlet约束:

然后解一个线性拉普拉斯方程。

尽管这样的计算代价比基于距离的计算更大,但它保证了平滑。基于距离的场可以有C1不连续。2种方式得到的标量场都可以调整为[0,1]映射到[0,1],这样就可以为融合提供更多的控制和灵活性。

标量场然后被用来衰减变换T。

//问题:T不一定是整体变换,H中每个点的T可能都不一样啊
此外,衰减也可以在旋转、scale和平移上分别应用。

这一变形方法简单有效,但一个问题就是基于距离的传播不能给出几何上最直观的解。这就需要依照位移函数d对控制点的变换进行平滑插值。或者最小化一些物理驱动的变形能量。如下一节所介绍的。

 9.2 基于薄壳的变形

更直观的变形d可以用最小化物理变形能量函数来实现。表面被假定为表现得像物理皮肤或薄板,并且像有力作用在上面一样进行伸展和弯曲。数学上,这一表现可以由能量函数来捕获,该函数会对伸展和弯曲作惩罚。

假定S和S'都是平滑的参数化曲面。则p、p'以及d都是从二维到R3的映射。
如第三章介绍的,第一和第二基本形式I(u,v)和II(u,v)可以用来度量S的几何本质属性(与参数化无关的属性),如长度、面积、曲率等。当S被变形为S'时,它的基本形式变为I'和II',基本形式的差值可以作为一个弹性薄壳能量,来度量伸展和弯曲。

 

其中,刚度系数ks和kb用来控制表面对伸展和弯曲的抵抗力。||丶||F为罗伯尼范数。在用户指定的变形约束下最小化9.3式的弹性能量。

然而,最小化非线性能量在计算上的代价太大,不适合交互性的应用。因此简化版本是将基本表示之差用d(位移)的偏微分表示。这导出了下面的薄壳能量:

 

注意到伸展和弯曲项几乎跟4.3节中的用来度量/最小化表面积和表面曲率的薄膜和薄板能量一样。唯一的区别是我们现在用位移d代替了位置p,从而最小化面积以及曲率的“改变”。也就是说,我们最小化了表面的伸展和弯曲。

对式9.4的最小化,我们采用类似4.3节中的变分法。这产生了相应的欧拉-拉格朗日方程。同样基于用户的约束之下。

因此,为了最小化式9.4,我们只需要解决式9.5的PDE方程。此时,我们再将连续的参数化曲面转化为离散的三角网格。这一步只需要将9.5的连续拉普拉斯算子用离散的余切拉普拉斯算子替换(在第三章有介绍过)。bi-Laplacian可以递归地用拉普拉斯算子的拉普拉斯算子定义:

其中di代表用户指定的位移。

 故9.5可以被离散化为:

 

 这样就可以用线性方程来表示。未知数为R中点的d值。已知数为H和F点的d值,被移动到右侧,作为线性方程的b。

其中L为拉普拉斯矩阵,在附录中有讲。x和b均为n*3的矩阵,在x y z三个坐标系上。所以该方程要解3次。

//疑问:为什么d和b都是n维?b完全可能比d多得多啊

用式9.7的解来最小化9.4可以保证C1连续表面的变形。对离散的三角网格,C1约束只在F和H的the rst two rings中被定义,F交H的其他点对解没有影响,所以也没有在式(9.6)和式(9.7)被纳入考虑。

//疑问:the 1st  two rings 是个什么东西

 

对H进行交互选取
改变了d_given的边界,因此用户每改动一次都需要重新解一次方程。附录中我们讨论了针对多个右值情况的线性方程的有效解法。同样,限定H的变换为仿射变换,可以指定变换的基函数,这样在式(9.7)中只需要考虑基函数即可。

和9.1节的变换传播相比,基于薄壳的方法计算复杂度更高。但利用合适的线性算法,仍然可以达到适合交互的速率。其主要优点是得到的变换更符合直觉,因为它是基于物理原理的。

 

9.3 多尺度变形


基于薄壳的变形能产生基于物理的、平滑的、直接的表面变形。但是,由于解的是一个线性系统,该方法不能正确处理表面细节。几何细节的局部旋转是非线性的,因此不能仅用线性技术来模拟。仍采用线性变形方法,一个处理这个细节的比较好的方式就是,用多尺度技术,这一节将会介绍这个方法。

 

主要的思想就是,用第4章介绍的平滑和整流技术,将目标物体分成2个频带;低频带对应平滑的整体形态,高频对应细节。我们的目标是将低频进行变形,并保留高频信息。这样就得到了想要的多尺度变形。

 

多尺度变形的流程如下(图9.7)。首先移除高频信息,S的低频表示被抽取出来,得平滑基础表面B。几何细节D = S - B,也就是,移除的部分作为细节信息被存储起来。这就允许我们通过将细节加回基础表面得到集合分别为分解算子和重建算子。加入变形算子将B变成B'。再将几何细节加回,S' = B' + D

 

注意到,可以引入超过1个的分解步骤,产生多层次的S = S0,S1,……Sk = B,复杂度随k增加而降低。这样频率随之一点点减少。Di+1 = Si - Si+1。这样变形后S' = B' + (Dk-i之和)。因为推广到多层次非常直接,我们将我们的解释限制在简单的2层分解情况。

 

一个完全的多尺度变形框架必须有3个基本操作。分解,变形和重建。分解一般用第4章的平滑或整流,变形可以用之前提到的方法,缺失的成分是对细节的适当表示:D = S - B,我们将要讨论它。

 

 

9.3.1 位移向量

对细节而言,一个直观的表示就是对于基本表面B的位移。细节信息是一个向量值的位移函数 h: B->R3,将每个点b移动了h(b)。在大多数情况下,S和B有同样的连通性,使得每个点的位移向量hi = pi - bi有:


pi = bi + hi


其中bi是B中对应S中pi的点。
//疑问:bi和pi的对应关系怎么找?


向量hi必须由B的局部信息编码,由bi点的法向量ni和2个切向量ti1,ti2决定。
hi = ai*ni + bi*ti1 + ri*ti2
//切向量和法向量线性组合

当B变形为B'后,位移向量根据基本表面的旋转而旋转,这导致了S'的比较合理的细节重建结果:


hi' = ai*ni' + bi*ti1' + ri*ti2'


当法向量ni被定义好后,我们该如何计算切向量ti1和ti2呢?一个启发式的方法是,选择ti1为第一个邻边到切平面的投影,ti2正交于ni和ti1即可。

 

9.3.2 法向位移

我们随后会发现,长的位移向量可能会导致不稳定,尤其对弯折变形更是如此。所以位移向量越短越好。所以定义位移向量为离bi点最近的pi之间的距离要好于对应点之间的距离。


//所以对应关系就是找最近点

这一想法导致了正交位移的概念,它与B垂直,也就是平行于法向量
pi = bi + hi*ni

然而每点的位移hi并不都会平行于ni,法向位移需要对S或B重采样。从B的每个点bi发射法向光线,与S相交,交点即为新的pi点,这样就产生了S的重采样版本。因为S具有高频细节,重采样可能会引入走样。

所以我们只能另辟蹊径。对S的每一点pi,一个局部牛顿迭代会找到bi,使得pi - bi和ni平行。注意到这里bi可以是B的任意一点,不一定要是顶点。bi通常取三角形的内部一点做重心插值。
bi = alpha*a + beta*b + r*c
其法向量很容易得出:
ni = (alpha*a + beta*b + r*c)/||alpha*a + beta*b + r*c||

用该B上的连续法向量场n(b),牛顿迭代可以找到合适的alpha,beta和r,从而得到bi

//2种找法向位移的方法,一个是对S重采样,但会带来走样问题;另一个是用牛顿迭代找到三角形里跟pi距离垂直的点作为bi

 

 

9.3.3 更先进的技术
法向位移非常高效,但它们的主要的问题是,邻居位移向量并不总是耦合的。当对表面进行高强度的弯折时,2个邻居位移向量的角度或增或减,导致几何细节的扭曲。在极端情况下,邻居位移向量彼此相交(当B'的曲率比位移hi大时),表面变成局部自交的。这一章,这些问题用更先进的编码方法解决。

位移体积。体的非自然改变和局部自交可以用位移体积取代位移向量来解决。对S的每个三角片面(pi,pj,pk),以及B中对应的三角形(bi,bj,bk),定义一个三角棱柱。这些三角棱柱的体积在变形的时候保持不变。也就是S'和B'形成的三角棱柱也是那样的体积。这样,局部体积的保持可以得到更符合直觉的变形效果。然而,这会带来计算量的增大。

变形转移。将基础表面的形变B->B'转移到S的细节上,得到多尺度的变形S'。该方法的结果和位移体积相似。但它要求解一个线性泊松系统。该方法的效果和计算量都介于位移向量和位移体积之间。

9.4 差分坐标
多尺度变形的方法可以保持细节,但产生多层次的形状还是比较复杂。为了避免多尺度的分解,另一类方法修改

了差分表面特性,而非空间坐标,从而重建出具有我们希望的差分坐标的变形表面。我们首先描述2种差分表示

,梯度表示和拉普拉斯表示,以及如何从差分坐标得出变形后的表面。然后我们将解释如何根据用户给定的变形

限定来使用差分坐标计算局部变形。


9.4.1 基于梯度的变形
基于梯度的方法首先找到原始表面梯度,然后使得变形表面切向梯度场和原来的匹配。这2部变形步骤可以用图9.11表示
// 总之就是先算出原始梯度JT,然后用Mt对其做一个变换,得JT',这样就跟原来的面片分离了,然后再找一个变形,把面片尽量补到JT'上去。

具体要求解一个泊松系统,比薄壳里求解bi-拉普拉斯要高效。



第6章 remeshing
对给定的一个3D网格,计算出一个网格,使它满足一些质量的要求,同时又跟输入网格十分近似。
目标:降低网格复杂度;提高网格质量。
其中,质量包括采样密度、规则程度、大小、方向、对齐、形状等特性。


6.1 局部结构
元素类型element type
包括三角网格和四边形网格,二者可互相转化。


元素形状element shape
各向同性/各向异性
当三角形等边,各向同性最高,同样当四边形为正方形,各向同性也最高。其余的奇形怪状歪瓜裂枣就是各向异性的代表。因此可以看出,各向异性的网格更有个性,能更好地表示surface。


元素密度element density
均匀分布/非均匀分布
非均匀分布在曲率大的地方元素越小,密度也就越大。所以在同样的表示效果下,用的元素个数会比均匀分布少。


元素对齐和方向Element alignment and orientation
因为resample的时候shape feature可能受到影响,所以需要在shape的地方对齐//没看懂这点
另外各向异性的元素的方向也很好的表示了surface