文章目录
- 6. Parametic Curves and Surfaces(参数曲线和参数平面)
-
- 6.1 Why we need parametric curves and surfaces?
- 6.2 Parametric curves(参数曲线)
- 6.3 Splines, interpolation and design curves
- 6.4 Local control
- 6.5 Revolved, extruded and swept surfaces
- 6.6 Tensor product surfaces(张量积曲面)
- 6.7 Bézier and B-Splines surfaces(贝塞尔曲面和B-样条曲面)
- 6.8 Trimming and control(修剪和控制)
- 6.9 Improving resolution(提高分辨率)
6. Parametic Curves and Surfaces(参数曲线和参数平面)
其实这可能不是我们第一次遇到Parametic curves,我们曾经在JavaFX中使用过Cubic curve,那个函数可以指定起始点、终点和控制点从而画出我们想要的曲线路径。
JavaFX的相关实践可以看这里:https://blog.csdn.net/sensen_kiss/article/details/135732103
6.1 Why we need parametric curves and surfaces?
6.1.1 Parametric curves
1.能对自然曲线物体有更好的3D渲染。
2.折线是由一系列的直线组成的,可能无法准确地描述复杂曲线地形状,可能结果不够真实、平滑,而参数曲线更灵活且准确。
6.1.2 Parametric surfaces
1.参数化曲面使用两个独立的参数来表示曲面。
2.可以相对容易地表示自交或不可定向的曲面。
3.使用隐式函数来表示这些曲面很多是不可能的。
4.即使可以使用隐式函数,其镶嵌表示通常也是不正确的。
6.2 Parametric curves(参数曲线)
2D参数曲线:(x(t), y(t))。
参数曲线通常使用一个参数(通常为t)来描述曲线上的点的位置,它沿着曲线的轨迹变化,从而确定曲线上的点的位置。
6.2.1 Straight Line(直线)
隐式表达: y = a 0 + a 1 x y = a_0 + a_1x y=a0+a1x
参数表达(显式表达):
x = x 1 + t ( x 2 – x 1 ) ( 0 ≤ t ≤ 1 ) x = x1 + t(x_2 – x_1) (0 ≤ t ≤ 1) x=x1+t(x2–x1)(0≤t≤1)
y = y 1 + t ( y 2 – y 1 ) y = y1 + t(y_2 – y_1) y=y1+t(y2–y1)
当 t = 0 , x = x 1 , y = y 1 t = 0, x = x_1, y = y_1 t=0,x=x1,y=y1
当 t = 1 , x = x 2 , y = y 2 t = 1, x = x_2, y = y_2 t=1,x=x2,y=y2
6.2.2 Circle(圆形)
隐式表达: x 2 + y 2 = r 2 x^2 + y^2 = r^2 x2+y2=r2
参数表达: x = r c o s ( 360 t ) , y = r s i n ( 360 t ) , ( 0 ≤ t ≤ 1 ) x = r cos(360t), y = r sin(360t), (0 ≤ t ≤ 1) x=rcos(360t),y=rsin(360t),(0≤t≤1)
6.2.3 Cubic curve(三次曲线)
x ( t ) = a 0 + a 1 t + a 2 t 2 + a 3 t 3 ( 0 ≤ t ≤ 1 ) x(t) = a_0 + a_1t + a_2t_2 + a_3t_3 (0 ≤ t ≤ 1) x(t)=a0+a1t+a2t2+a3t3(0≤t≤1)
y ( t ) = b 0 + b 1 t + b 2 t 2 + b 3 t 3 ( 0 ≤ t ≤ 1 ) y(t) = b_0 + b_1t + b_2t_2 + b_3t_3 (0 ≤ t ≤ 1) y(t)=b0+b1t+b2t2+b3t3(0≤t≤1)
对于不同的三次曲线我们这里的 a i , b i a_i,b_i ai,bi取不同的值。
6.3 Splines, interpolation and design curves
6.3.1 Interpolation(插值)
任意曲线我们可以有表达式: x ( t ) = a 0 + a 1 t + a 2 t 2 + a 3 t 3 , + … + a n t n x(t) = a_0 + a_1t + a_2t^2 + a_3t^3, + … + a_nt^n x(t)=a0+a1t+a2t2+a3t3,+…+antn,显然当我们的表达式如果是高次多项式的时候,所需的计算量就会很大。因此我们可以使用插值技术从而用低次多项式曲线取逼近高次多项式曲线,从而减少计算量。
为了找到更精确的 a i a_i ai,在有k个点的情况下我们需要n = k - 1个点去插值。
ex:对于直线来说,它的控制点k = 2,因此 n = k - 1 = 1.
对于parabola(抛物线)来说,它的控制点k = 3,因此 n = k - 1 = 2.
6.3.1.1 为什么我们不使用高次多项式进行插值?
如果我们使用高次多项式进行插值,在控制点的数量k很多时,高次多项式会在曲线的两端产生剧烈的震荡。
使用低次多项式还可以简化计算,与高次多项式相比更高效。
因此我们在面对有大量控制点的曲线时,我们将这些点分为多个小的集合,比如每个集合包含4个点,然后对每个小集合中的4个点用低次多项式进行插值,从而使用3个低次多项式,画出这些曲线,最后将这些曲线平滑的曲线连接起来。这就是分段插值法(Piecewise Interpolation)。
由于低次高项式可以简化计算、减少震荡、平滑连接,因此我们使用低次多项式进行插值。
6.3.2 Splines(样条)
样条插值通过将整个曲线或曲面分解为多个小的曲线段或曲面片来进行插值,每个小段用低次多项式(通常是三次多项式)组成,最后将这些小段平滑地连接在一起。
6.3.2.1 连续性的各种要求
在曲线或曲面设计中,通常需要满足不同类型的连续性要求:
1.曲线的连续性(没有断裂)。
2.切线的连续性(没有尖锐的转折)。
3.曲率的连续性(非必需,但它可以避免一些由光照引起的视觉伪影)。
6.3.2.2 Interpolation and design curves(插值曲线和设计曲线)
插值曲线:
1.插值曲线定义了曲线必须通过的确切位置(点),例如在关键帧动画中,物体必须在特定的时间点处位于特定的位置。
2.插值曲线的形状取决于提供的数据点。
设计曲线:
1.设计曲线定义了曲线的一般行为,例如曲线应该是什么样子,并且通常需要调整曲线的形状。这种方法通常由设计师使用。
2.设计曲线的形状取决于控制点,这些点并不位于曲线上,但可以通过移动这些点来调整曲线的形状。
因此由上面的定义可以看出,我们JavaFX的CubicCurve是设计曲线,而非插值曲线。
设计曲线是由多个分离的部分组成在一起,这些部分每个都可以独立地进行调整,然后再将它们连接在一起形成完整地曲线。
这意味着对于一条曲线来说,我们修改它的其中一部分,不会影响其他部分。这是局部调整的关键——不影响已经完成的部分,而只我们想要影响的曲线的一小部分。
6.4 Local control
缺少局部控制的曲线:
1.Natural splines(自然样条)
自然样条在曲线的两端,通常是第一个和最后一个数据点处,会施加额外的条件,从而确保曲线在两端的行为更加自然平滑。也因此它无法实现局部控制。
2.Bezier curves(if continuity enforced)(对连续性有严格要求的贝塞尔曲线)
有局部控制的曲线:
1.B-Splines(B-样条)
2.NURBS(Non-Uniform Rational B-Splines)(非均匀有理B-样条)
一个具有局部控制的三次曲线:
通常只会被4个控制点影响,因此最直接影响它形状调整的就是这4个控制点。
比如三次贝塞尔曲线,而JavaFX中使用的CubicCurve就是三次贝塞尔曲线。
在设计曲线中除了控制移动点外,有的曲线还提供了额外的参数,以保证控制点不变的情况下,对曲线进行一定程度的调整,这些额外的参数包括tension(张力)和bias(偏移)。
这些控制方法除了应用于设计曲线还可以应用于插值曲线。
6.5 Revolved, extruded and swept surfaces
讲完参数曲线,现在介绍参数平面。
6.5.1 Revolved surface(旋转曲面)
一个二维曲线绕着一个轴旋转得到的三维曲面。这个过程中的参数是旋转角度。
6.5.2 Extruded surface(挤压曲面)
通过沿着二维曲线的法线方向移动该曲线来创建一个三维曲面。这个过程中的参数是移动的直线深度。
6.5.3 Extruded surface(扫描曲面)
一个二维曲线沿着一个三维路径进行移动,从而创建一个三维曲面。这个过程中参数是路径的定义。
6.6 Tensor product surfaces(张量积曲面)
最重要的参数化平面是Tensor product surfaces(张量积曲面),它是使用最广泛的参数化平面。
张量积曲面是由两个参数曲线组合而成的,这两个曲线在垂直方向上运行。
比如前面的扫描曲面,可以视为是一个张量积曲面,因此它的两个参数分别是u和v。
6.7 Bézier and B-Splines surfaces(贝塞尔曲面和B-样条曲面)
我们前面介绍了插值曲线和设计曲线,同理曲面有插值曲面和设计曲面。
它使用一个控制网格,通常是一个控制点的矩形数组,来进行局部控制,由于曲线是分成了更小的曲线,所以曲面也被分成了更小的曲面片段。在这种情况下我们的局部控制更加重要。
在具有局部控制的Cubic curve(三次曲线)中,一个曲线段通常受到4个点的控制,因此在一个Cubic surface(立方曲面)中,一个曲面片段受到16个点的控制,形成了一个4x4的网络。
当我们在曲面片段的连接时(多个曲面片段被组合在一起形成一个更大的曲面时),曲面片段的连接并不总是直接的。我们需要在曲面片段连接时考虑如何确保曲面的整体连接性。
6.8 Trimming and control(修剪和控制)
6.8.1 Trimming
当我们部分的曲面不需要展示出来的时候,我们可以定义trim line(修剪线),在修剪一侧的曲面部分将被移除,另一侧将被保留。从而减少渲染的花费。
注意Trimming操作是在建模阶段的,而Clipping操作是在变换阶段的,但两者都是为了提高渲染的效率。
6.8.2 Control
控制曲面的方法与控制曲线的方法类似,包括移动控制网格中的点,这样可以直接调整曲面的形状。此外,对于某些类型的曲面,还可以使用张力和其他参数来调整曲面的特性,而无需移动控制网格中的点。
6.9 Improving resolution(提高分辨率)
为了获取更精确的细节,可以增加曲面的片段数量。
有时候我们可以根据需要,自适应调整增加片段数量的方法,比如只在需要展示细节的地方增加片段数量。这样可以节省计算量。
然而这种自适应增加可能会导致cracks(裂缝)的产生,因此在增加片段的时候需要小心。而这种cracks(裂缝)的产生,是因为曲面的连接不是直接的或者说不是无缝的。