9

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

4

3 回答 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 的回应完全相同)。

贝塞尔到 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 的代码很短而且很重要)。它很有用,因为我们现在可以很容易地超越 Hermites。

特别是我们可以引入其他经典的基数三次参数曲线: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]

贝塞尔到 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 通常是主要表示形式。

于 2009-10-22T02:57:37.793 回答
6

正如 Steven 所提到的,您可以将三次 Hermite 曲线转换为三次 Bezier 曲线。其实很简单。

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

  • P0- 起点
  • V0-- 导数P0
  • P1-- 终点
  • V1-- 导数P1

转换为三次贝塞尔曲线很简单:

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

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

于 2009-07-08T17:07:10.540 回答
1

You can convert any Hermite curve into a Bezier curve and then draw that. They are simply defined using two different bases in C3. Google wasn't very useful, and it seems like this would be a common question, so we should try to make the StackOverflow answer definitive, maybe with some sample code. I'll come back tomorrow with more.

于 2009-06-23T04:41:48.253 回答