我使用样条曲线我使用相机旅行了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)
答案 0 :(得分:6)
Catmull-Rom样条通常由几个段组成,每个段插入一对连续的控制点。 glm::catmullRom
函数只计算此曲线的一个段,这取决于四个连续的控制点(p0
,p1
,p2
,{{ 1}})。曲线段始终从p3
变为p1
,而点p2
和p0
仅影响曲线之间的弯曲方式,如下所示:
(图片来自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
中的所有点。