- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 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
函数仅计算该曲线的一个段,这取决于四个连续的控制点(p0
、p1
、p2
、p3
)。曲线段总是从 p1
到 p2
,而点 p0
和 p3
只影响曲线弯曲的方式介于两者之间,如下所示:
(图像由 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/
我需要对我正在尝试的技术进行一些说明。我正在尝试将一个实体从 A 点移动到 B 点,但我不希望该实体沿直线移动。 例如,如果实体位于 x: 0, y:0 并且我想到达点 x:50, y: 0,我希望实
我需要对我正在尝试的技术进行一些说明。我正在尝试将一个实体从 A 点移动到 B 点,但我不希望该实体沿直线移动。 例如,如果实体位于 x: 0, y:0 并且我想到达点 x:50, y: 0,我希望实
我有 4 个点,我使用样条曲线与相机一起旅行,如何使用 glm::gtx_spline::catmullRom 生成曲线? 它是来自 glm_gtx_spline 的函数 http://glm.g-t
我是一名优秀的程序员,十分优秀!