【问题标题】:1D Hermite Cubic Splines with tangents of zero - how to make it look smoother切线为零的 1D Hermite Cubic Splines - 如何使其看起来更平滑
【发布时间】:2015-11-06 00:43:02
【问题描述】:

我得到了 3 个值 y0y1y2。它们应该是均匀分布的,比如x0 = -0.5x1 = 0.5x2 = 1.5。为了能够通过所有这些点画一条样条线,所有点的导数都被称为dy/dx = 0

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

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

有什么想法可以让我的曲线看起来更平滑吗?

【问题讨论】:

    标签: cubic-spline catmull-rom-curve


    【解决方案1】:

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

    【讨论】:

    • 哦,对不起,我有没有提到它实际上是一维的?不过,它将非线性地转换为 2D,但有一次我只有在x in [0;1] 范围内进行转换的信息。所以你实际上可以把我给定的x(y) 看作是u(t)。不过还是谢谢。我看到你和我走的路一样,直到我意识到他们根本没有提供足够的数据让它看起来真的很好。
    【解决方案2】:

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

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

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

    t(x) = 0.5 * (1.0 - cos( PI * ( x-x0 ) ) 替换t(x) = 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                                |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-12
      • 2021-04-15
      • 2011-06-18
      • 2019-11-25
      • 1970-01-01
      • 2013-03-14
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多