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

twe*_*ypi 17 c++ opengl directx graphics 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连续是否容易.

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

Geo*_*ips 9

看看等式2 - 它描述了控制点如何影响线.你可以看到点P0P3进入方程沿曲线绘制点P1P2.您还可以看到该方程给出了P1t == 0P2t == 1.

该示例等式可以概括.如果你点R0,R1... RN那么你就可以绘制的点RK,并RK + 1利用公式2 P0 = RK - 1,P1 = RK,P2 = RK + 1P3 = RK + 2.

你不能从剧情R0R1或者从RN - 1RN,除非你增加额外的控制点,以代替R - 1RN + 1.一般的想法是,您可以选择要添加到序列的头部和尾部的任何点,以给自己计算样条曲线的所有参数.

您可以通过删除它们之间的一个控制点来将两个样条线连接在一起.假设你有R0,R1,...,RNS0,S1... SM他们可以结合成R0,R1,..., ,,RN - 1 ,... .S1S2SM

要计算任何点的切线,只需采用等式2的导数即可.


Eri*_*ric 6

维基百科的文章进入多一点点深度.样条的一般形式将具有相关切向量的2个控制点作为输入.如果公共控制点处的切向量相等,则可以添加附加样条段,这保留了C1连续性.

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

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

T(n) = (P(n - 1) + P(n + 1)) / 2
Run Code Online (Sandbox Code Playgroud)

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

  • 很抱歉,如果我错过了什么,但是您能指出这篇文章中给出该公式的地方吗?我在http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Catmull.E2.80.93Rom_spline中看到了另一种。(我不太擅长数学。我只是想知道您如何获得公式。) (2认同)