C++ 向心的卡特穆尔是如何做到的–;Rom花键工作?

C++ 向心的卡特穆尔是如何做到的–;Rom花键工作?,c++,opengl,graphics,directx,spline,C++,Opengl,Graphics,Directx,Spline,从中,似乎有关于Catmull Rom样条曲线的最详细信息,创建样条曲线似乎需要四个点。但是,它没有提到点p0和p3如何影响p1和p2之间的值 我的另一个问题是如何创建连续样条线?通过使p4=p2(也就是说,假设我们有p0,p1,p2,p3,p4,p5,p6,…,pN),将点p1,p2定义为与p4,p5连续是一样容易的 一个更普遍的问题是如何计算Catmull-Rom样条曲线上的切线?它是否需要在样条曲线上取两个点(比如在0.01、0.011处)并根据毕达哥拉斯求出切线,给定这些输入值给出的位置

从中,似乎有关于Catmull Rom样条曲线的最详细信息,创建样条曲线似乎需要四个点。但是,它没有提到点p0和p3如何影响p1和p2之间的值

我的另一个问题是如何创建连续样条线?通过使p4=p2(也就是说,假设我们有p0,p1,p2,p3,p4,p5,p6,…,pN),将点p1,p2定义为与p4,p5连续是一样容易的

一个更普遍的问题是如何计算Catmull-Rom样条曲线上的切线?它是否需要在样条曲线上取两个点(比如在0.01、0.011处)并根据毕达哥拉斯求出切线,给定这些输入值给出的位置坐标?

会更深入一点。样条曲线的一般形式采用2个具有相关切线向量的控制点作为输入。如果公共控制点处的切线向量相等,则可以添加其他样条曲线段,从而保持C1连续性

在特定的Catmull Rom形式中,中间点的切线向量由相邻控制点的位置确定。因此,要通过多个点创建C1连续样条曲线,只需提供第一个和最后一个控制点处的控制点集和切线向量即可。我认为标准行为是使用P1-P0作为P0处的切向量,PN-PN-1作为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处的切线向量会影响它们之间的插值段的形状。

看看等式2——它描述了控制点如何影响直线。您可以看到点
P0
P3
进入方程,用于沿曲线从
P1
P2
绘制点。您还将看到,当
t==0
时,等式给出了
P1
,当
t==1
时,等式给出了
P2

这个例子方程可以推广。如果你有点
R0
R1
,…
RN
,那么你可以通过使用等式2和
P0=RK-1
P1=RK
P2=RK+1
P3=RK+2
来绘制
RK
RK+1
之间的点

您不能从
R0
R1
或从
RN-1
RN
绘图,除非您添加额外的控制点以代替
R-1
RN+1
。一般的想法是,您可以选择要添加到序列的头部和尾部的任何点,为自己提供计算样条线的所有参数

通过在两条样条曲线之间放置一个控制点,可以将两条样条曲线连接在一起。假设你有
R0
R1
,…,
RN
S0
S1
,…
SM
,它们可以加入
R0
R1
RN-1
S1
S2
SM


要计算任意点的切线,只需取方程2的导数。

如果我遗漏了什么,我很抱歉,但是你能指出文章中给出公式的地方吗?我在街上看到一个不同的。(我的数学不是很好。我只是想知道你是如何得到这个公式的。)普通的Catmull Rom也容易出现循环和自相交,这可能是一个问题。我强烈建议使用如下所示的向心参数化: