如何使用glm_gtx_spline :: catmullRom生成样条曲线?

时间:2016-05-14 19:05:06

标签: c++ opengl glm-math

我使用样条曲线我使用相机旅行了4点,如何使用glm :: gtx_spline :: catmullRom生成曲线?

这是来自glm_gtx_spline http://glm.g-truc.net/0.9.4/api/a00203.html

的函数
genType catmullRom (genType const &v1, genType const &v2, genType const &v3, genType const &v4, typename genType::value_type const &s)

1 个答案:

答案 0 :(得分:6)

Catmull-Rom样条通常由几个段组成,每个段插入一对连续的控制点。 glm::catmullRom函数只计算此曲线的一个,这取决于四个连续的控制点(p0p1p2,{{ 1}})。曲线段始终从p3变为p1,而点p2p0仅影响曲线之间的弯曲方式,如下所示:

Catmull-Rom curve segment
(图片来自Hadunsford - 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=28956755

通过按顺序链接其中几个曲线段,可以创建Catmull-Rom样条曲线,该样条曲线插入一系列(任意数量的)控制点。如果每个Catmull-Rom曲线段由四个连续的控制点计算,则得到的样条曲线将是连续且平滑的(C 1 连续)。

给定 n 控制点的向量p3,以下函数计算参数cp的Catmull-Rom样条曲线的值(其中t为从0到 n -1):

t

在此实现中,相关控制点索引被限制在范围(0, n -1)。从概念上讲,这实现了第一个和最后一个控制点的加倍,这些控制点的作用是glm::vec3 catmull_rom_spline(const std::vector<glm::vec3>& cp, float t) { // indices of the relevant control points int i0 = glm::clamp<int>(t - 1, 0, cp.size() - 1); int i1 = glm::clamp<int>(t, 0, cp.size() - 1); int i2 = glm::clamp<int>(t + 1, 0, cp.size() - 1); int i3 = glm::clamp<int>(t + 2, 0, cp.size() - 1); // parameter on the local curve interval float local_t = glm::fract(t); return glm::catmullRom(cp[i0], cp[i1], cp[i2], cp[i3], local_t); } 的第一个和最后一个控制点也被插值。

在0和 n -1之间改变参数cp现在将在平滑曲线上追踪点,插入t中的所有点。