Catmull-Rom样条 - 它们如何工作?

时间:2009-07-06 06:05:12

标签: c++ opengl graphics directx spline

从这个似乎有关于catmull-rom splines的最详细信息的网站:http://www.mvps.org/directx/articles/catmull/,它提到需要四个点来创建样条曲线。然而,它没有提到点p0和p3如何影响p1和p2之间的值。

我的另一个问题是如何创建连续样条线?通过使p4 = p2(假设我们有p0,p1,p2,p3,p4,p5,p6 ...... pN)来定义点p1,p2与p4,p5连续是否容易。 / p>

更普遍的问题是如何计算catmull rom样条上的切线?它是否必须涉及在样条上取两个点(比如0.01,0.011)并根据输入值给出的位置坐标得到基于毕达哥拉斯的切线?

2 个答案:

答案 0 :(得分:9)

看看等式2 - 它描述了控制点如何影响线。您可以看到点P0P3进入等式,以绘制从P1P2的曲线上的点。您还会看到等式在P1t == 0P2t == 1

此示例等式可以推广。如果您有点R0R1,... RN,那么您可以使用公式2和RK绘制RK + 1P0 = RK - 1之间的点数,P1 = RKP2 = RK + 1P3 = RK + 2

您无法从R0R1或从RN - 1RN进行投标,除非您添加额外的控制点以代替R - 1和{ {1}}。一般的想法是,您可以选择要添加到序列的头部和尾部的任何点,以给自己计算样条曲线的所有参数。

您可以通过删除它们之间的一个控制点来将两个样条线连接在一起。假设您有RN + 1R0,...,R1RNS0,... S1他们可以加入{{1} },SM,...,R0R1RN - 1,... S1

要计算任意点的切线,只需采用等式2的导数。

答案 1 :(得分:6)

Wikipedia article进一步深入。样条的一般形式将具有相关切向量的2个控制点作为输入。如果公共控制点处的切向量相等,则可以添加额外的样条线段,这样可以保持C1的连续性。

在特定的Catmull-Rom形式中,中间点处的切向量由相邻控制点的位置确定。因此,为了通过多个点创建C1连续样条曲线,在第一个和最后一个控制点处提供一组控制点和切向量就足够了。我认为标准行为是使用P1 - P0作为P0处的切向量和PN处的PN - PN - 。

根据维基百科的文章,要计算控制点Pn处的切线,可以使用以下公式:

T(n) = (P(n - 1) + P(n + 1)) / 2

这也回答了你的第一个问题。对于一组4个控制点,P1,P2,P3,P4,P2和P3之间的插值需要所有4个控制点的信息。 P2和P3本身定义插值段必须通过的端点。 P1和P3确定插值段在点P2处将具有的切向量。 P4和P2确定该段在点P3处将具有的切向量。控制点P2和P3处的切向量影响它们之间的插值段的形状。