在OpenGL中绘制Hermite曲线

9 opengl bezier interpolation hermite

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

Ian*_*Ian 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开始).然后转换到贝齐尔:

Catmull-Rom到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通常是主要的代表.


Naa*_*aff 6

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

典型的三次Hermite曲线由两个点和两个向量定义:

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

转换为立方贝塞尔简单地说:

B0 = P0
B1 = P0 + V0/3
B2 = P1 - V1/3
B3 = P1
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*eld 1

您可以将任何 Hermite 曲线转换为 Bezier 曲线,然后进行绘制。它们是使用 C3 中的两个不同基数简单定义的。Google 并不是很有用,而且这似乎是一个常见问题,因此我们应该尝试使 StackOverflow 的答案变得明确,也许可以使用一些示例代码。明天我会带着更多回来。