我一直在努力让 Catmull-Rom 样条线为一个辅助项目工作,并且很难让它完成我需要的工作。我尝试了以下两种实现,但都不适用于我,而且我无法追踪我的代码中相对于他们的任何错误(我必须假设已经过测试)。我称他们为“ABC”解决方案:
https://en.wikipedia.org/wiki/Centripal_Catmull%E2%80%93Rom_spline
然后我实现了以下解决方案(我称之为“矩阵”解决方案),它确实使用编辑后的第 3 版帖子工作: https ://www.opengl.org/discussion_boards/showthread.php/159518-catmull-rom-样条
但是,此 Matrix 解决方案仅实现了具有 0.5 'a' 值的 Catmull-Rom 内置到矩阵中。我想让 Chordal 工作,因此我需要 'a' == 1。
鉴于我对 ABC 版本的解决方案引起了问题,我尝试使用此处的矩阵 ( http://algorithmist.net/docs/catmullrom.pdf ) 来传递我自己的“a”。这是原始的 0.5 代码,后面是我修改后的代码,它传入了用户指定的“a”。
原始代码:
float u2 = u * u;
float u3 = u2 * u;
return ((2 * x1) +
(-x0 + x2) * u +
(2*x0 - 5*x1 + 4*x2 - x3) * u2 +
(-x0 + 3*x1 - 3*x2 + x3) * u3) * 0.5f;
修改代码:
float u2 = u * u;
float u3 = u2 * u;
static float a = 0.5f;
return ((1.0f * x1) +
((-a*x0) + (a*x2)) * u +
((2.0f*a)*x0 + (a-3.0f)*x1 + (3.0f-(2.0f*a))*x2 + (-a*x3)) * u2 +
((-a*x0) + (2.0f-a)*x1 + (a-2.0f)*x2 + (a*3.0f)) * u3) * 0.5f;
这当然行不通。但是,我不明白为什么。在 pdf 第 4 页的底部,它显示了带有“a”的矩阵。我已经在上面修改过的代码中替换了它,并对其进行了三次检查,但样条曲线被搞砸了。它应该给我同样的答案。更令人困惑的是,他在第 5 页上的结果采用了生成的矩阵并将其乘以 0.5,从而将所有 /2 从矩阵条目中删除。最终矩阵使用这些值,但第 4 页上的原始矩阵不是 0.5 * 矩阵,它只是“矩阵”。为什么这个 0.5 是任意添加的,为什么没有它一切都会崩溃?
无论如何,有谁知道我的方程式可能做错了什么?我可以使用这种矩阵形式从 0-1 传入我自己的“a”并创建均匀、向心和弦样条线,还是必须使用 ABC 形式?
提前致谢!