这是3D第9章的翻译,解释了平滑插值的基本概念以及贝塞尔函数和样条函数的使用。 本书的内容仍在进行中,因此本文的内容将会不断完善。 如果您有任何建议,请随时告诉我。
注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另外:项目有相关翻译、内容组织、课程项目实施的完整信息。 平滑插值 ( )
让我们考虑一种称为关键帧动画 ( ) 的技术。 在此环境中,动画师 ( ) 描绘一系列特定时刻的 3D 计算机图形动画的快照 ( )。 每个 () 都是根据一组建模参数定义的。 这些参数可能包含很多物体的()和()信息,当然还有相机的位置和方向。 此外,还包含模型运动部件的关节角度等信息。 为了从这些关键帧生成平滑的动画,计算机的工作就是在连续的时间范围内平滑地“填充”参数值。 如果这样一个动画参数称为c,那么我们的每一个具体的()都可以称为c_i,其中i是某个范围内的整数,那么我们的工作就是将这个参数的()转换为一个连续函数()到时间,c(t)。 我们通常希望函数 c(t) 足够平滑,以便生成的动画不会显得太不稳定。
在本章中,我们讨论在局部实数范围内平滑插值这样一组特定值的简单方法,通常是借助 () 函数。 例如,在图 \text{ 9.1} 中,我们显示了一个函数 c(t), t \in [0..8],它与在 -1..9 上插值的整数值 c_i,i \in -1..9 相关联。具体值,它们显示为蓝点(是否需要在-1和9处附加不参与插值的具体值,稍后将阐明)。 我们的 () 函数将由独立的分段函数组成,其中每个分段函数都是某种较低的多项式函数。 这些多项式块函数经过专门选择,以便它们平滑地“缝合在一起”。 () 函数在计算机图形学中经常使用,因为它们易于表达、评估和控制。 事实上,它们的行为比单个更高多项式函数的行为更可预测。
我们还将展示如何使用此类 () 函数表达式来描述空间和平面中的曲线。 除了动画之外,此类曲线还有许多用途。 例如,它们可以用在字体中来描述字符形状的轮廓。
9.1:()函数用于对一系列表示为点的控制值进行平滑插值。
9.1 三次贝塞尔函数(Cubic)
我们首先研究如何表达三次多项式函数 c(t),t \in [0..1] (见图 \text{ 9.2} )。 有很多可能的方法可以做到这一点,这里我们描述 () 表达式方法。 这是一个方便的表达式,其中参数具有几何解释,并且评估简化为重复线性插值。
9.2:() 函数由 4 个控制值确定。
在三次贝塞尔表达式(cubic)中,三次函数由称为控制值(value)的四个值c_0、d_0、e_0、c_1来描述。 在插图\文本{9.2}中,我们可以将这些数据可视化为 2D(t,c) 平面上的点。 这些点的坐标为 [0,c_0],[1/3,d_0],[2/3, e_0],[1,c_1]。 我们还用浅蓝色绘制一条连接这些点的折线; 这条折线称为控制多边形 ( )。
为了在任意 t 值处计算函数 c(t),我们执行以下线性插值序列:
\begin{数组}{rclr} f &=& (1 − t)c_0 + td_0 & (9.1) \\g &=& (1 − t)d_0 + te_0 & (9.2) \\h &=& (1 − t)e_0 + tc_1 & (9.3) \\ m &=& (1 − t)f + tg & (9.4) \\ n &=& (1 − t)g + th & (9.5) \\ c( t) &=& (1 − t)m + tn & (9.6) \\ \end{数组} \\
在插图\文本{9.3}中,当t=0.3时,我们将这个计算步骤可视化为二维空间中的线性插值。
9.3:对于 t 变量的任何值,() 函数都可以通过该图可视化的一系列线性插值步骤来评估。
9.1.1 属性()
很容易验证函数c(t)具有以下性质。
通过扩展上述评估步骤,我们可以确认函数c(t)具有以下形式:
c(t)= c_0(1 − t)^3 + 3d_0t(1 − t)^2 + 3e_0t^2(1 − t) + c_1t^3 \\
毫无疑问,这是一个三次函数。 此外,c_i由函数c(0)=c_0和c(1)=c_1插值。 通过推导,我们看到 c'(0) = 3(d_0-c_0) 和 c'(1) = 3(c_1-e_{0})。 在插图 \text{ 9.2} 中,我们确实观察到 c(t) 函数的斜率与控制多边形 ( ) 在 0 和 1 处的斜率相匹配。我们还可以看到,如果我们设置 c_0 = d_0 = e_0 = c_1 = 1,那么对于t的所有值,函数c(t)=1。 这个性质被称为(unity的)一致性划分,也就是说给所有控制值加上一个常量值就相当于把这个常量值加上到函数c(t)中。
9.1.2 翻译()
如果我们想要获得分别在 t = i 和 t = i+1 处对具体值 c_i 和 c_{i+1} 进行插值的三次函数,同时调用另外两个控制点 d_i 和 e_i,我们只需要将式(9.1)的评估算法进行“平移”,得到如下评估步骤:
\begin{array}{rcll} f &=& (1 − t + i)c_i + (ti)d_i & (9.7) \\ g &=& (1 − t + i)d_i + (ti)e_i & ( 9.8) \\ h &=& (1 − t + i)e_i + (ti)c_{i+1} & (9.9) \\ m &=& (1 − t + i)f + (ti)g & (9.10) \\ n &=& (1 − t + i)g + (ti)h & (9.11) \\ c(t) &=& (1 − t +i)m + (ti)n & ( 9.12) \\end{数组} \\
9.2 -Rom样条函数(-Rom)
让我们回到对一系列具体值 c_i,i \in -1..n+1 进行插值的原始问题。 执行此操作的一个简单方法是使用 -Rom 样条函数 (-Rom)。 此方法为变量 t \in [0..n] 定义函数 c(t)。 该函数由 n 个三次函数定义,每个三次函数都支持单位区间 t \in [i..i+1]。 选择块函数(块)来对 c_i 值进行插值,同时满足其一阶导数。
每个块函数在 4 个控制值的帮助下以其贝塞尔表示 ( ) 确定:c_i、d_i、e_i 和 c_{i+1}。 基于我们的输入值。 为了设置 d_i 和 e_i 的值,我们施加约束 c′(t)|i = \frac{1}{2} (c_{i+1} − c_{i−1} ) 。 换句话说,我们向前寻找一个样本,向后寻找一个样本 e,以确定 t=i 处的斜率; 这就是为什么我们需要额外的边缘值 ( ) c_{-1} 和 c_{n+1} 。 因为在贝塞尔表达式 ( ) c'(i) = 3(d_i-c_i) = 3(c_i-e_{i-1}) 中,这实际上告诉我们需要进行以下设置:
\begin{array}{rcl} d_i &=& \frac{1}{6}(c_{i+1}-c_{i−1} ) + c_i & (9.13)\\ e_i &=& \frac{ -1}{6}(c_{i+2}-c_{i} ) + c_{i+1} & (9.14)\\ \end{array} \\
这个过程在图\text{9.4}中直观地表示。 这里我们显示了三次函数段所需的控制值c、d和e(其中d和e以红色显示)。 我们用浅蓝色显示三次分段函数的控制多边形。 控制值 d 和 e 是借助深蓝色显示的字符串 ( ) 确定的。
9.4:-Rom 样条函数(-Rom)由多个独立的块函数(块)组成。 每个块函数都可以用 () 形式表示。 这里我们展示如何通过输入控制值来确定贝塞尔曲线。 箭头所指的线段具有相同的斜率。
9.3 四元数样条 ( )
() 和 -Rom 表达式可用于对任何实值动画参数进行插值。 例如,如果我们有一个时变平移,那么 3 个定义的平移参数 t_x、t_y 和 t_z 可以独立插值。
如果我们想在一系列方向上进行插值,则不能直接应用该理论(-Rom 和表达式)。 目前正在研究在这种情况下使用的最佳理论方法。 一种有效的方法是简单地将上述 () 操作替换为适当的 () 操作。 通过这些替换,() 加法变为 () 乘法,() 负运算变为 () 求逆(倒数运算),() 乘法变为 () 幂运算。 像这样继续进行,这种形式的 () 评估步骤:
r = (1 − t)p + tq \\
变得
r = slerp(p, q, t) \\
同时,d_i和e_i四元数()的值定义如下:
\begin{array}{rl} d_i &=& ((c_{i+1}c_{i−1}^{−1} )^\frac{1}{6})c_i \\ e_i &=& ( (c_{i+2}c_{i}^{−1} )^\frac{-1}{6})c_{i+1} \end{array} \\
如7.4小节中所述,为了在“短路径”上进行插值,如果四元数 () c_{i+1}c_{i-1}^{-1} 的第一个坐标值为负,则在应用之前求幂运算符,我们对其求反。
参考文献 [68] 和 [66] 中描述了其他基于四元数样条 ( ) 的 slerp 方法。 参考文献中描述了另一种基于 n 路球体混合的更自然但更昂贵的方法。 [10]。
还有一种在实践中经常使用的可选方法。 此方法只是将 () 视为 R^4 空间中的点,并对这些点的坐标执行标准 () 操作。 然后将结果标准化以获得单位范数。 在这种情况下,参考文献[22]中描述了线段之间连续性的条件。
9.4 其他样条函数(Other)
还有许多其他类型的样条函数 ( ),我们会提到它们的名称,因为您可能会偶然遇到它们,但我们不会详细介绍。 这些样条函数在计算机辅助几何设计领域得到了深入研究。 有兴趣的读者不妨阅读参考书目[21]和[59]。
自然三次样条 (cubic) 函数对其控制值进行插值并最小化第二个导出积分。 这样的 () 在某种意义上是“最平滑”的插值体积。 已证实自然三次样条 ( ) 由满足一阶导数和二阶导数的三次分段函数(分段)组成。 需要求解线性方程组才能确定这样的自然三次样条函数。 该样条函数的行为是全局的:移动一个控制值会影响整个函数值范围。
均匀(三次或三次)B 样条通过一组拼接在一起的三次(三次)多项式来表达函数,同时满足二阶导数。 与自然三次样条函数不同,该函数仅随着控制值的变化而局部变化。 然而,B 样条不会插入任何控制值,而只是近似它们。
非均匀 B 样条是均匀 B 样条的推广,它允许变量 t 集上的控制值的间距不均匀,同时保持二维连续性。
最后,非均匀有理 B 样条(或 NURB)是非均匀 B 样条的推广,其中每个“部分”是两个多项式函数的有理(比率)表示。 这种形式的有理数允许您对许多经典代数形状进行建模。
9.5 空间曲线(in Space)......
出于动画目的,我们研究了单变量 () 函数(这里我们将自由变量视为时间)。 您可以使用 () 表达式来描述空气中的曲线。 在这种情况下,样条由 2D 或 3D 空间中的一系列控制点 \tilde{c} 控制。 通过将样条构造函数独立地应用于 x、y、z 坐标,可以获得点值样条函数\tilde{c}(t); 您可以将其视为随着时间的推移在空中飞行的一个点,绘制输出样条线 \gamma。
借助用 4 个控制点表示的 构造( ),我们得到一条 ( )曲线(参见插图 \text{ 9.5} ,然后借助控制点上的 -Rom 构造,我们可以得到-Rom曲线(参见图\text{9.5})。
在曲线的上下文中,统一属性意味着如果将所有控制点平移某个固定量,那么这将导致 \gamma 曲线平移该量。
另外,对于(和B样条)曲线,对于每个t变量,函数值\tilde{c}(t)是通过在控制点的某个位置处混合得到的,其中混合量总是位于0 和 1。 总之,曲线必须位于通过连接空间中的点定义的控制多边形的“外壳”内。 这意味着曲线不会超出控制多边形的边界太远。
9.5:二维空间中的 () 曲线。
9.6:-2D 空间中的 Rom 曲线。