在OpenGL中绘制Hermite曲线

9

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

3个回答

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的代码简短明了)。这很有用,因为现在我们可以轻松地超越Hermite。

特别地,我们可以引入另一种经典的Cardinal Cubic Parametric Curve:Catmull-Rom曲线。它具有控制点[c_1 c0 c1 c2](与Bezier曲线不同,曲线从第二个到第三个控制点运行,因此通常从-1开始编号)。然后转换为Bezier:

Catmull-Rom转Bezier

[b0] = 1 [ 0  6  0  0] [c_1]
[b1] - [-1  6  1  0] [c0]
[b2] 6 [ 0  1  6 -1] [c1]
[ 0 0 6 0] [c2]
贝塞尔曲线转卡特穆勒-罗姆曲线
[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曲线转成卡特穆勒-罗姆曲线,但它们很少使用,因为Bezier曲线通常是主要表示形式。


6
正如Steven提到的那样,你可以将一个三次Hermite曲线转换为一个三次Bezier曲线。这实际上非常简单。
一个典型的三次Hermite曲线由两个点和两个向量定义:
- P0 - 起始点 - V0 - 在P0处的导数 - P1 - 结束点 - V1 - 在P1处的导数
将其转换为三次Bezier曲线只需要简单的操作:
B0 = P0
B1 = P0 + V0/3
B2 = P1 - V1/3
B3 = P1

您可以使用估值器或任何其他方式绘制贝塞尔曲线。


1

您可以将任何Hermite曲线转换为Bezier曲线,然后绘制它。它们在C3中使用两个不同的基础定义。Google并没有提供太多有用的信息,而且这似乎是一个常见的问题,因此我们应该尝试使StackOverflow的答案成为权威性的,可能还要附带一些示例代码。我明天会回来补充更多内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接