任意数量控制点的B样条

时间:2017-01-31 04:29:02

标签: c++ bezier spline bspline softbody

我目前正在使用数字弹簧物理学开发软体系统,我终于开始工作了。我的问题是,目前一切都是直线。

我的目标是复制类似于游戏“地板是果冻”的东西,除了光滑的角落和变形之外,一切都有效。目前直线和棱角分明。

我尝试使用Cubic Bezier方程,但这意味着每3个节点我有一条新曲线。是否存在Bezier样条曲线的等式,其中包含n个控制点,这些控制点将与vec2的循环一起使用(因此节点[0]是第一个和最后一个控制点)。

对不起,我没有任何代码可以显示,但我完全被难以忍受,谷歌搜索没有任何提示。

2 个答案:

答案 0 :(得分:0)

只需google" B-spline库"会给你很多参考。话虽如此,B-spline并不是您唯一的选择。您可以使用三次Hermite样条(由一系列点和导数定义)(有关详细信息,请参阅link)。

另一方面,您还可以继续在系统中使用直线,并创建一条曲线来插补直线顶点,仅用于显示目的。要通过一系列数据点创建插值曲线,Catmull-Rom样条曲线是轻松实现的不错选择。这种方法可能比在系统中使用B样条曲线具有更好的性能。

答案 1 :(得分:0)

我会使用B样条来解决这个问题,因为它们可以用最少的控制点来表示平滑的曲线。此外,找到给定数据集的近似光滑表面是一个简单的线性代数问题。

我编写了一个简单的B样条C ++库(也包括Bezier曲线),我将其用于科学计算,这里: https://github.com/feevos/bsplines

它可以接受任意数量的控制点/多重性并给你一个基础。但是,创建适合您数据的B样条曲线是您必须要做的事情。

GNU GSL中也存在B样条的一个很好的实现(但没有Bezier曲线) https://www.gnu.org/software/gsl/manual/html_node/Basis-Splines.html)。同样,您必须在给定的基础上将控制点实现为2 / 3D,并修复边界条件以适合您的数据。

有关开/关曲线和B样条的更多信息,请点击此处: https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/index.html