1D Hermite Cubic Splines,切线为零 - 如何使其看起来更平滑

时间:2015-11-06 00:43:03

标签: cubic-spline catmull-rom-curve

我获得了3个值y0y1y2。它们应该是均匀间隔的,例如x0 = -0.5x1 = 0.5x2 = 1.5。为了能够在所有点上绘制样条曲线,所有点的导数都被称为dy/dx = 0

现在渲染两个Catmull-Rom-Splines(通过GLSL片段着色器完成,包括非线性变换)的结果看起来非常严格。即但是,曲线弯曲时,它会很平滑,但弯曲区域非常小。缩小使得弯曲看起来太尖锐。

我想切换到TCB-Splines(又名.Kochanek-Bartels样条曲线),因为那些提供张力参数 - 因此我希望我可以平滑外观。但我意识到应用于零切线的所有TCB参数都不会有任何好处。

任何想法如何让曲线看起来更平滑?

2 个答案:

答案 0 :(得分:0)

2d参数曲线的切向量f(t)=(x(t),y(t))定义为f'(t)=(dx(t)/ dt,dy(t) / DT)。当您需要曲线在某些点处具有dy / dx = 0时,它仅表示这些点处的切线向量将水平移动(即,dy / dt = 0)。它并不一定意味着切向量本身是零向量。所以,你仍然可以使用TCB样条函做你想做的任何事情。

答案 1 :(得分:0)

显然没有人有一个好的答案,但由于这是我的工作,我找到了一个解决方案:点数均匀分布,其目的是使转换更顺畅。现在给出的是,在所有给定点处切线都为零,因此很可能接近我们获得最强曲率的点y'(x)。这意味着,我们希望在这些点周围延伸这些区域。

考虑到目前我们使用Catmull-Rom-Splines,在这些点之间划分。这使得y(x) => y(t) , t(x) = x-x0

t(x)需要在0 - 和1 - 区域内展开。因此余弦函数跳入我的脑海:

t(x) = x-x0替换t(x) = 0.5 * (1.0 - cos( PI * ( x-x0 ) )为我完成了这项工作。

简短说明:

  • [0,PI]范围内的余弦从1顺利运行到-1
  • 我们希望从01,但
  • 所以翻转它:1-cos() - >现在它从02
  • 减半:0.5*xxx - >现在它从01

另一个问题是找到正确的切线。通常,使用Matrix-Vector-Math计算这样的样条曲线,您只需导出t-vector以获得切线,因此导出[t³ t² t 1]会产生[3t² 2t 1 0]。但在这里,t并不简单。使用this我找到了正确的派生向量:

| 0.375*PI*sin(PI*t)(1-cos(PI*t))² |
| 0.500*PI*sin(PI*t)(1-cos(PI*t))  |
| 0.500*PI*sin(PI*t)               |
| 0                                |