我有起点和终点以及这些点的曲线斜率值。现在我必须通过两个给定点绘制“平滑的 2D 贝塞尔曲线”。现在如何定位这两个控制点来实现这一点。有什么办法吗?我知道控制点必须位于各自起点和终点的切线上。
- 注意:“平滑曲线”是指最终情节中不应有陡峭的曲线或转弯。
我有起点和终点以及这些点的曲线斜率值。现在我必须通过两个给定点绘制“平滑的 2D 贝塞尔曲线”。现在如何定位这两个控制点来实现这一点。有什么办法吗?我知道控制点必须位于各自起点和终点的切线上。
听起来你有 catmull-rom 曲线坐标(两个点,以及它们的出发和到达切线),在这种情况下https://pomax.github.io/bezierinfo/#catmullconv涵盖了将它们转换为贝塞尔坐标所需的所有数学. 如果您不关心“如何”,只需跳到本节末尾的直接转换规则即可。
tl;dr 版本:将您的坐标重写为 Catmull 形式:
[P1, v1, v2, P2] -> [P1 - v1, P1, P2, P2 + v2]
然后我们将其转换为贝塞尔坐标:
P1 <= P1
p2 <= P1 - (P2 - P1 - v1) / 6 * f
p3 <= P2 + (P2 + v2 - P1) / 6 * f
p4 <= P2
是f
张力常数。玩弄那个。它通常为 1,但可能并不取决于这些切线的强度。
对于由 P0、P1、P2 和 P3 定义的三次贝塞尔曲线,其中 P0 和 P3 是起点和终点,其在 t=0 和 t=1 处的一阶导数向量为
C'(t=0) = 3*(P1-P0)
C'(t=1) = 3*(P3-P2)
因此,如果您已经知道起点和终点的斜率,您可以轻松地将其转换为切向量并找到控制点 P1 和 P2。您确实需要为一阶导数向量分配适当的幅度,以便最终生成的曲线没有拐点。但只要确保由 P0、P1、P2 和 P3 形成的控制多边形是凸的,那么三次贝塞尔曲线应该是平滑的并且没有转弯。