0

我得到 3 个值y0, y1, y2. 它们应该是均匀分布的,例如x0 = -0.5, x1 = 0.5, x2 = 1.5。并且为了能够通过所有这些绘制样条曲线,所有点的导数都被称为dy/dx = 0

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

我想切换到 TCB-Splines(又名 Kochanek-Bartels Splines),因为它们提供了张力参数——因此我希望我可以平滑外观。但我意识到所有应用于零切线的 TCB 参数都没有任何好处。

有什么想法可以让我获得更平滑的曲线吗?

4

2 回答 2

0

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

于 2015-11-08T00:33:10.210 回答
0

显然没有人有一个好的答案,但因为这是我的工作,我找到了一个解决方案:点是均匀分布的,这个想法是让过渡更平滑。现在已经给出,所有给定点的切线都为零,因此最有可能靠近我们得到最强曲率 y''(x) 的点。这意味着,我们想拉伸这些“点周围的区域”。

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

t(x)需要围绕0- 和 - 区域1展开。所以余弦函数跳进了我的脑海:

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

简短说明:

  • 范围内的余弦[0,PI]1到平稳运行-1
  • 不过,我们想从 to0运行1
  • 所以翻转它:1-cos()->现在它从0到运行2
  • 减半:0.5*xxx->现在它从01

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

| 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                                |
于 2015-11-17T20:51:36.783 回答