我获得了3个值y0
,y1
,y2
。它们应该是均匀间隔的,例如x0 = -0.5
,x1 = 0.5
,x2 = 1.5
。为了能够在所有点上绘制样条曲线,所有点的导数都被称为dy/dx = 0
。
现在渲染两个Catmull-Rom-Splines(通过GLSL片段着色器完成,包括非线性变换)的结果看起来非常严格。即但是,曲线弯曲时,它会很平滑,但弯曲区域非常小。缩小使得弯曲看起来太尖锐。
我想切换到TCB-Splines(又名.Kochanek-Bartels样条曲线),因为那些提供张力参数 - 因此我希望我可以平滑外观。但我意识到应用于零切线的所有TCB参数都不会有任何好处。
任何想法如何让曲线看起来更平滑?
答案 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
。0
到1
,但1-cos()
- >现在它从0
到2
0.5*xxx
- >现在它从0
到1
另一个问题是找到正确的切线。通常,使用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 |