在OpenGL中绘制Hermite曲线

时间:2009-06-23 04:18:08

标签: opengl interpolation bezier

如何使用OpenGL绘制Hermite曲线,是否有内置函数?我在网上看到了一些示例,展示了如何使用评估器绘制Bezier曲线,但找不到Hermite曲线的任何信息。

3 个答案:

答案 0 :(得分:11)

让Bezier的控制点矢量为[b0 b1 b2 b3],Hermite的控制点矢量为[h0 h1 v0 v1](v0和v1为点h0和h1的导数/正切)。然后我们可以使用矩阵形式来显示转换:

Hermite到Bezier

[b0] = 1 [ 3  0  0  0] [h0]
[b1]   - [ 3  0  1  0] [h1]
[b2]   3 [ 0  3  0 -1] [v0]
[b3]     [ 0  3  0  0] [v1]

(这与上面Naaff的回答完全相同)。

Bezier到Hermite

[h0] = [ 1  0  0  0] [b0]
[h1]   [ 0  0  0  1] [b1]
[v0]   [-3  3  0  0] [b2]
[v1]   [ 0  0 -3  3] [b3]

因此,在矩阵形式中,这些可能比需要的稍微复杂一些(毕竟Naaff的代码很简单并且非常重要)。它很有用,因为我们现在可以很容易地超越隐士。

特别是我们可以引入另一个经典的基数立方参数曲线:Catmull-Rom曲线。它有控制点[c_1 c0 c1 c2](与贝塞尔曲线不同,曲线从第二个控制点到第三个控制点,因此惯常编号从-1开始)。然后转换到Bezier:

Catmull-Rom to Bezier

[b0] = 1 [ 0  6  0  0] [c_1]
[b1]   - [-1  6  1  0] [c0]
[b2]   6 [ 0  1  6 -1] [c1]
[b3]     [ 0  0  6  0] [c2]

Bezier到Catmull-Rom

[c_1] = [ 6 -6  0  1] [b0]
[c0]    [ 1  0  0  0] [b1]
[c1]    [ 0  0  0  1] [b2]
[c2]    [ 1  0 -6  6] [b3]

我也可以使用Hermite到Catmull-Rom对,但它们很少使用,因为Bezier通常是主要的代表。

答案 1 :(得分:6)

正如Steven所提到的,您可以将立方Hermite曲线转换为三次Bezier曲线。它实际上非常简单。

典型的立方​​Hermite曲线由两个点和两个向量定义:

  • P0 - 起点
  • V0 - 衍生于P0
  • P1 - 结束点
  • V1 - 衍生于P1

转换为三次贝塞尔曲线只是:

B0 = P0
B1 = P0 + V0/3
B2 = P1 - V1/3
B3 = P1

然后,您可以使用和评估者或任何其他方式绘制贝塞尔曲线。

答案 2 :(得分:1)

您可以将任何Hermite曲线转换为Bezier曲线然后绘制。它们简单地使用C3中的两个不同碱基来定义。谷歌不是很有用,似乎这是一个常见的问题,所以我们应该尝试使StackOverflow回答确定,可能还有一些示例代码。明天我会带更多回来。