gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:40 24 4
gpt4 key购买 nike

我有 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)

最佳答案

Catmull-Rom 样条通常由多个段组成,每个段内插一对连续的控制点。 glm::catmullRom 函数仅计算该曲线的一个,这取决于四个连续的控制点(p0p1p2p3)。曲线段总是从 p1p2,而点 p0p3 只影响曲线弯曲的方式介于两者之间,如下所示:

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

通过按顺序链接这些曲线段中的几个,您可以创建一个 Catmull-Rom 样条插值一系列(任意数量的)控制点。如果每个 Catmull-Rom 曲线段是从四个连续的控制点计算的,则生成的样条将是连续且平滑的(C1 连续)。

给定一个包含 n 个控制点的 vector cp,以下函数计算参数 t 处的 Catmull-Rom 样条值(其中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 的第一个和最后一个控制点也被插值。

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

关于c++ - 如何使用 glm_gtx_spline::catmullRom 生成样条曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37230747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com