2

我正在尝试创建一个接收任意数量的点(位置和控制)的类,并根据给定的信息创建一个 catmull-rom 样条曲线。

我正在做的 - 我真的不确定这是否是正确的方法 - 将每个单独的点存储在一个类中,如下所示:

class Point { public: Vector3 position; Vector3 control; }

其中显然 position 是点的位置,而 control 是控制点。

我的问题是连接样条线 - 显然,鉴于上述类在样条线数组中持有一个点,表明任何给定位置只能有一个控制点。因此,当 catmull rom 样条中有三个或更多点时,正在连接的各种单独的 catmull-rom 样条共享一个位置,并且与另一个这样的样条共享一个控制。

现在需要相同的位置 - 因为我想创建它们之间连续的样条线。但是我真的很想知道,两条样条线之间的控制点是否也应该相同?稍微摆弄一下控制点,我可以让它看起来从一个样条曲线平滑过渡到另一个,但是我必须强调,我不确定它们的过渡方式是否与 catmull-rom 样条曲线形成它们的形状一致. 我宁愿正确地做它,也不愿坐在我的手上并合理化它已经足够好。

显然我的问题的第二部分是不言自明的:给定两个控制点和位置点,我如何计算 catmull-rom 样条的长度?

4

2 回答 2

4

要定义两个控制点之间的样条,Catmull-Rom 样条需要控制点和每个控制点处的切向量。但是,内部(即非端点)控制点处的切向量由其任一侧的控制点定义:T(P n ) = (P n+1 - P n-1 ) / 2。对于闭合曲线,样条完全由控制点集定义。对于非闭合曲线,您还需要提供第一个和最后一个控制点的切线向量。通常这样做:T(P 0 ) = P 1 - P 0和 T(P n ) = P n - P n-1

因此,对于闭合曲线,您的数据结构只是一个控制点列表。对于一般样条曲线,它是点列表加上第一个和最后一个法线向量。

如果你想要一个基数样条,那么你可以在切线向量计算中添加一个加权因子,如维基百科文章中所述。

要计算这种样条的长度,一种方法是通过在许多点处评估样条然后计算每对相邻点之间的线性距离来近似它。

于 2009-07-18T15:28:12.410 回答
1

关于测量长度,您可以使用微积分来做到这一点,因为它是多项式样条。您需要对直线上的距离函数进行积分。它在维基百科上描述得很好......

于 2009-07-18T19:07:13.607 回答