如何使用 OpenGL 绘制 Hermite 曲线,有内置函数吗?我在网上看到了一些示例,这些示例展示了如何使用评估器绘制贝塞尔曲线,但找不到任何有关 Hermite 曲线的信息。
3 回答
让 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 通常是主要表示形式。
正如 Steven 所提到的,您可以将三次 Hermite 曲线转换为三次 Bezier 曲线。其实很简单。
典型的三次 Hermite 曲线由两个点和两个向量定义:
P0
- 起点V0
-- 导数P0
P1
-- 终点V1
-- 导数P1
转换为三次贝塞尔曲线很简单:
B0 = P0
B1 = P0 + V0/3
B2 = P1 - V1/3
B3 = P1
然后,您可以使用和评估器或您希望的任何其他方式绘制贝塞尔曲线。
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.