阅读 362

WebGL 三维模型的表示方式(三)

📒前言

拖更许久,如果你问我为什么,我会说我去寻找快乐了🍔

最近让脑子休息整顿了一下,接下来会继续学习分享🤓这次继续我们还没说完的三维模型的表示方式

⎰细分曲面

细分曲面通过为多边形网格附加一组可以使其更细化(利用细分)的规则以更好地近似所表示的曲面。在用这种方式解决离散近似产生的问题时,细分曲面与多边形网格具有相同的性能,这也促进了几何建模中细分方法的发展。细分成为曲线、曲面的离散和连续两种表示方式之间的桥梁。

Chaikin 算法

Chaikin算法 是由一种由一组控制点开始,通过细分生成的曲线的方法。假设初始曲线 P0P^{0} 由顶点序列 {p10,p20,,pn0}\{p_{1}^{0},p_{2}^{0},\cdots,p_{n}^{0}\} 表示,这里点的上标表示曲线的细分层次,0层对应于初始控制多边形。在细分过程的每一步中,Chaikin 方法在每对相邻顶点之间生成两个新顶点时使用下面的规则:

q2ik+1=34pik+14pi+1kq2i+1k+1=14pik+34pi+1kq_{2i}^{k+1}=\frac{3}{4}p_{i}^{k}+\frac{1}{4}p_{i+1}^{k} \\ q_{2i+1}^{k+1}=\frac{1}{4}p_{i}^{k}+\frac{3}{4}p_{i+1}^{k}

其中,qil+1q_{i}^{l+1}k+1k+1 层细分生成的新顶点。生成新顶点之后将丢弃旧顶点,在 k+1k+1 层仅由新顶点 qik+1q_{i}^{k+1} 定义曲线。下图展示了一条由4个控制点构成的曲线上完成第一步细分后的结果:当 kk 趋于无穷时,将产生一条连续的极限曲线,记为 PP^{\infty}

Chaikin 方法在特定情况下可以生成 二次B样条。与参数曲面一样,细分模式可以是插值或逼近方式。如果极限曲线是通过对初始控制多边形的点进行插值得到的,那么细分模式是插值方式。插值的每一个细分步骤都确保旧顶点和新生成顶点位于曲线上,并且旧顶点保留在原来的位置上。如果在每次细分后,旧顶点被丢弃或者根据某些规则进行移动,并不是对初始控制顶点进行插值而得到的曲线,那么该细分模式是逼近模式。综上,Chaikin 细分模式是逼近方式。

4点算法

4点算法是基于 插值模式 生成曲线的实例。这种细分模式使用顺序为 pi2,pi1,pip_{i-2}, p_{i-1}, p_ipi+1p_{i+1} 的4个点相继生成新的点。细分规则如下图所示:

{q2ik+1=pikq2i+1k+1=(12+w)(pik+pi+1k)w(pi1k+pi+2i)\begin{cases} q_{2i}^{k+1} = p_i^k \\ q_{2i+1}^{k+1} = (\frac{1}{2} + w)(p_i^k + p_{i+1}^k) - w(p_{i-1}^{k} + p_{i+2}{i}) \end{cases}

权重 ww 使我们可以通过增加或减少曲线的张力来控制曲线的最终形状。当 w=0w = 0 时,最终的曲线是初始点的线性插值曲线;当 w=116w = \frac{1}{16} 时,将得到一个三次插值曲线;当 0<w<180 < w < \frac{1}{8} 时,最终的曲线是连续可微的(C1C^1)。

书中关于四点算法的内容就到此为止,就这两段话也太敷衍了?我就去翻阅了相关论文更详细的介绍如下(分割线中的内容)。


已知控制点 {Pi}i=2n+2\{\overline{P}_{i}\}_{i=-2}^{n+2}PiRd\overline{P}_{i} \in R^{d},中间的点通过下面的模式添加进入:

Pi+1/2=(12+w)(Pi+Pi+1)w(Pi1+Pi+2),  1in.(1.1)\overline{P}_{i+1/2}=(\frac{1}{2}+w)(\overline{P}_{i} + \overline{P}_{i+1})-w(\overline{P}_{i-1}+\overline{P}_{i+2}),\; -1\leq i \leq n. \tag{1.1}

增强的点集 {Pi/2}i=22n+2\{\overline{P}_{i/2}\}_{i=-2}^{2n+2} 被视作新的控制点,并继续用相同的方法在连续的点之间插入新的点,然后依次往复。

在每一阶段,最后插入的四个连续的点集定义了新的中间点,我们用 {Pik}i=22n+2\{\overline{P}_{i}^{k}\}_{i=-2}^{2n+2} 表示 klevelk-level 的控制点集。然后细分模式通过下面的模式定义 k+1levelk+1-level 的控制点:

{P2ik+1=Pik,1i2kn+1P2i+1k+1=(12+w)(Pik+Pi+1k)w(Pi1k+Pi+2k),  1i2kn(1.2)\begin{cases} \overline{P}_{2i}^{k+1}=\overline{P}_{i}^{k}, \qquad -1 \leq i \leq 2^{k}n+1 \tag{1.2} \\ \overline{P}_{2i+1}^{k+1}=(\frac{1}{2}+w)(\overline{P}_{i}^{k}+\overline{P}_{i+1}^{k})-w(\overline{P}_{i-1}^{k}+\overline{P}_{i+2}^{k}), \; -1 \leq i \leq 2^{k}n \end{cases}

Pi0=Pi,2in+2\overline{P}_{i}^{0}=\overline{P}_{i}, -2 \leq i \leq n+2

通过令 kk 趋向于无穷,这个过程就在 RdR^{d} 中定义了一个无限点集。我们面对的问题是,是否这些点位于 RdR^{d} 中的一条连续曲线,并且这条曲线平滑度如何,取决于参数 ww 的值。

通过将 (1.1)(1.1) 写成以下形式,可以看出对方案 (1.2)(1.2) 的一个很好的几何解释:

Pi+1/2=12(Pi+Pi+1)+2w[12(Pi+Pi+1)12(Pi1+Pi+2)](1.3)\overline{P}_{i+1/2}=\frac{1}{2}(\overline{P}_{i} + \overline{P}_{i+1})+2w[\frac{1}{2}(\overline{P}_{i}+\overline{P}_{i+1}) - \frac{1}{2}(\overline{P}_{i-1}+\overline{P}_{i+2})] \tag{1.3}

w=0w=0 时,点 Pi+1/2\overline{P}_{i+1/2} 就是线段 (Pi,Pi+1)(\overline{P}_{i}, \overline{P}_{i+1}) 的中点。当 w0w \not= 0 时,中点被 2we2w\overline{e} 校正,其中 e\overline{e} 是从 (Pi1,Pi+2)(\overline{P}_{i-1}, \overline{P}_{i+2}) 的中点到 (Pi,Pi+1)(\overline{P}_{i}, \overline{P}_{i+1}) 的中点的向量。很明显如果初始控制点在线性折线 MRdM \subset R^{d} 上,那么后续所有点也都在 MM 上。

上述方案的几何解释明确了 ww 作为张力参数的作用,将 ww 的值降为零,相当于将相应的曲线向控制多边形 —— 控制点之间的片状线性曲线收紧。

在实验中观察到,方案 (1.2)(1.2)0w140 \leq w \leq \frac{1}{4} 时会产生一条连续且具有且向量的曲线(在后面将会对曲线的极限进行分析)。同时,我们也证明了对于任何 w>0w>0 的情况下,由一般控制点集决定的曲线分量在参数化 P(t),t[0,n]\overline{P}(t), t \in [0, n] 中没有二次导数,它将 Pik\overline{P}_{i}^{k} 附在参数值 2ki,k0,0i2kn2^{-k}i, k \geq 0, 0 \leq i \leq 2^{k}n 上。

模式 (1.1)(1.1) 可以产生连续的曲线,其切线和曲率为:

Pi+1/2=(916+2θ)(Pi+Pi+1)(116+3θ)(Pi1+Pi+2)+θ(Pi2+Pi+3)(1.1)\overline{P}_{i+1/2} = (\frac{9}{16} + 2\theta)(\overline{P}_{i} + \overline{P}_{i+1}) - (\frac{1}{16} + 3\theta)(\overline{P}_{i-1}+\overline{P}_{i+2})+\theta (\overline{P}_{i-2} + \overline{P}_{i+3}) \tag{1.1}

对于 θ=0\theta=0,这个方案对应于 w=116w=\frac{1}{16}。对任何 θ\theta,方案 (1.4)(1.4) 满足的 [Dyn, Levin '86] 中推导的一般 2r2r 点方案产生的 C2C^{2} 分量曲线的必要条件。保证曲线曲率连续性的值是:0<θ<0.020< \theta <0.02

详情可参考Dyn Nira,Levin David,Gregory John A.. A 4-point interpolatory subdivision scheme for curve design[J]. North-Holland,1987,4(4).


介绍少了模糊,介绍多了又看不懂!

简单来说,其实就是通过初始的4个控制点基于特定的细分规则生成曲线实例,细分规则中的 ww 可以控制曲线的张力。Can u feel me?

细分方法分类

原始或对偶细分方式

如果一个细分模式是对网格的面进行细分,则称为 原始模式(面分割);如果是通过顶点实现的,则成为 对偶模式(顶点分割)

下图使用的 1-4 分割 是一种常用的原始细分模式,这种模式在保留旧顶点的同时,通过在较粗的网格的每一条边上插入一个新顶点,然后将新插入的顶点连接起来,而将一个面细分成4个新面:

对偶细分模式针对多边形的对偶网格进行细分,将面的质心视为顶点,然后利用一条边将相邻面的新顶点连接起来。因此任一顶点的每个相邻面内部将生成一个新的顶点:

对于四边形网格,可以通过对偶细分得到仅包含四边形面片的细化网格;而对于三角形网格,顶点细分(对偶)模式将得到非嵌套六边形小面片。因此四边形非常特殊,能够自然地支持原始细分模式也支持对偶细分模式。

逼近与插值

细分方法可以通过对初始曲线和曲面进行插值,或者对初始控制网络进行逼近来生成曲线或曲面。原始模式既可以是插值的也可以是逼近的,而对偶模式本质上是逼近的。

插值在很多方面具有良好的特性:首先控制点也是极限曲面上的点;其次,可以显著地简化算法而提高计算效率;此外,针对不同的需要,可以通过在网格的不同部分执行不同的细分步数而将网格的细化进行局部调整。然而,插值模式生成的曲面质量低于逼近模式,并且收敛到极限曲面的速度通常也慢于逼近模式。

之前在询问古神相关问题时,古神回答到“逼近是对数据进行打磨,而插值则是通过插入新的数据使其平滑”。你们细细品!

🎬结束语

三维模型的表示方式就讲到这里了,总结共分成了3篇文章介绍,主要包括:

  • 多边形网格
  • 贝塞尔曲线/面和B样条曲线/面
  • 曲面细分方式

对于表示方式还有很多方面,比如模型的数据结构、体素、几何建模、过程建模等。大家感兴趣可以继续去了解,运用强大的搜索引擎获取自己想要的知识也是一种能力😉

欢迎关注公众号:Refactor,感谢阅读!