在OpenGL中绘制Hermite曲线

在OpenGL中绘制Hermite曲线,opengl,interpolation,bezier,hermite,Opengl,Interpolation,Bezier,Hermite,如何使用OpenGL绘制Hermite曲线,是否有内置函数?我在网上看到了一些示例,这些示例演示了如何使用计算器绘制贝塞尔曲线,但找不到任何有关埃尔米特曲线的信息。您可以将任何埃尔米特曲线转换为贝塞尔曲线,然后绘制该曲线。它们只是使用C3中的两个不同碱基定义的。Google并不是很有用,而且这似乎是一个常见的问题,所以我们应该尝试让StackOverflow的答案更明确,也许需要一些示例代码。明天我会带更多回来。正如史蒂文提到的,你可以将三次埃尔米特曲线转换为三次贝塞尔曲线。其实很简单 典型的三

如何使用OpenGL绘制Hermite曲线,是否有内置函数?我在网上看到了一些示例,这些示例演示了如何使用计算器绘制贝塞尔曲线,但找不到任何有关埃尔米特曲线的信息。

您可以将任何埃尔米特曲线转换为贝塞尔曲线,然后绘制该曲线。它们只是使用C3中的两个不同碱基定义的。Google并不是很有用,而且这似乎是一个常见的问题,所以我们应该尝试让StackOverflow的答案更明确,也许需要一些示例代码。明天我会带更多回来。

正如史蒂文提到的,你可以将三次埃尔米特曲线转换为三次贝塞尔曲线。其实很简单

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

  • P0
    ——起点
  • V0
    --在
    P0处的导数
  • P1
    ——终点
  • V1
    --在
    P1
转换为立方贝塞尔的过程很简单:

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

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

让贝塞尔曲线的控制点矢量为[b0 b1 b2 b3],而埃尔米特曲线的控制点矢量为[h0 h1 v0 v1](v0和v1是点h0和h1处的导数/切线)。然后我们可以使用矩阵形式来显示转换:

埃尔米特到贝塞尔

[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] [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] [b0]=1[3 0 0][h0] [b1]-[3 0 1 0][h1] [b2]3[03 0-1][v0] [b3][03 0][v1] (这与上面纳夫的回答一模一样)

贝塞尔到埃尔米特

[h0] = [ 1 0 0 0] [b0] [h1] [ 0 0 0 1] [b1] [v0] [-3 3 0 0] [b2] [v1] [ 0 0 -3 3] [b3] [h0]=[100][b0] [h1][01][b1] [v0][3 0][b2] [v1][0-3][b3] 因此,在矩阵形式中,这些可能比需要的稍微复杂一些(毕竟Naaff的代码很简短,切中要害)。它很有用,因为我们现在可以很容易地超越赫米特

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

卡特穆尔Rom到贝塞尔

[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] [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] [b0]=1[0600][c_1] [b1]-[-1610][c0] [b2]6[0116-1][c1] [b3][060][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] [c_1][6-6 01][b0] [c0][100][b1] [c1][01][b2] [c2][10-66][b3] 我也可以做Hermite-to-Catmull Rom对,但它们很少使用,因为贝塞尔通常是主要的表示