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

Mat*_*ber 2 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)
Run Code Online (Sandbox Code Playgroud)

jsb*_*jsb 6

Catmull-Rom样条通常由若干段组成,每个段插入一对连续的控制点.的glm::catmullRom函数计算仅一个该曲线的,它依赖于四个连续的控制点(p0,p1,p2,p3).曲线段总是从去p1p2,而分p0p3只影响曲线如何在弯曲之间,如下图所示:

Catmull-Rom曲线段
(图片来自Hadunsford - 自己的作品,CC BY-SA 3.0,https: //commons.wikimedia.org/w/index.php?cookies = 28956755 )

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

给定的矢量cpÑ控制点,下面的函数计算的Catmull-Rom样条中的参数的值t(其中,t从0到Ñ -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);
}
Run Code Online (Sandbox Code Playgroud)

在该实现中,相关控制点索引被钳位到范围(0,n -1).从概念上讲,这实现了第一个和最后一个控制点的加倍,这些控制点具有cp也插入第一个和最后一个控制点的效果.

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