将Catmull-Rom样条连接在一起并计算其长度?

时间:2009-07-18 10:56:01

标签: c++ opengl graphics directx spline

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

我正在做什么 - 而且我真的不确定这是否是正确的方法 - 将每个单独的点存储在类中:

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

显然,位置是点的位置,控制是控制点。

我的问题是将样条连接起来 - 显然上面的类在样条数组中保持一个点表明任何给定的位置只能有一个控制点。因此,当在一个catmull rom spline中有三个或更多个点时,连接的各个catmull-rom样条曲线与另一个这样的样条曲线共用一个位置和一个控件。

现在需要位置相同 - 因为我想创建在它们之间连续的样条曲线。但我真的很想知道两个样条之间的控制点是否相同?随着控制点的一些摆弄,我可以使它看起来从一个样条曲线平滑过渡到另一个样条曲线但是我必须强调我不确定它们的过渡方式是否与catmull-rom花键形成它们的形状一致。我宁愿做正确的事,也不愿坐在我的手上,理性化它就足够了。

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

2 个答案:

答案 0 :(得分: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

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

如果您想要一个基数样条曲线,则可以在Wikipedia article中为切线向量计算添加加权因子。

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

答案 1 :(得分:1)

关于测量长度,您可以使用微积分来执行此操作,因为它是多项式样条曲线。您需要在整个线路上集成距离函数。它在Wikipedia ...

上描述得很好