计算贝塞尔样条曲线以从点到点进行计算

时间:2009-12-10 07:15:12

标签: math graphics 2d bezier spline

我在X,Y +旋转中有2个点,我需要计算一个贝塞尔样条(一组二次贝塞尔曲线),它们可以平滑地连接这两个点。 (见图)该点代表游戏中只能缓慢旋转的单位。所以要从A点到B点,它必须走很长的路。附图显示了相当夸张的弯曲路径,但你明白了。

alt text

我可以使用哪些公式来计算这样的贝塞尔曲线?

3 个答案:

答案 0 :(得分:5)

刚看到我误解了你的问题。你有没有使用单cubic hermite splines,因为你有一个起点和终点以及两个方向(切线)?还有其他限制吗?

要计算起点和终点切线,只需使用起点和终点方向,然后使用起点和终点之间的距离进行缩放(另外还有一些其他常数因子,如0.5,具体取决于您想要路径的曲率)。 :

p0 = startpoint;
p1 = endpoint;
float scale = distance(p0, p1);
m0 = Vec2(cos(startangle), sin(startangle)) * scale;
m1 = Vec2(cos(endangle), sin(endangle)) * scale;

我使用这个系统在我正在进行的游戏中插入摄像机路径并且效果很好。

答案 1 :(得分:4)

正如您可能知道的那样,即使我们假设有2个控制点,也会有无限的解决方案。

我找到Smoothing Algorithm Using Bézier Curves,它会回答您的问题(请参阅开头的Bx(t)By(t)的等式):

B x (t)=(1-t) 3 P 1x + 3(1-t) 2 < / sup> t P 2x + 3(1-t)t 2 P 3x + t 3 P <子> 4倍

B y (t)=(1-t) 3 P 1y + 3(1-t) 2 < / sup> t P 2y + 3(1-t)t 2 P 3y + t 3 P <子> 4Y

P 1 且P 4 是您的终点,P 2 和P 3 是控制点,您可以自由选择所需的角度。如果您的控制点与点r之间的角度θ距离(x, y),则该点的坐标为:

x'= x - r sin(θ)

y'= y - r cos(θ)

(根据您使用的坐标系统 - 我认为我得到了正确的标志)。唯一的免费参数是r,您可以根据需要选择它。你可能想用

r =αdist(P 1 ,P 4

,α<&lt; 1。

答案 2 :(得分:2)

我不记得我从哪里得到它,但我一直在使用它:

Vector2 CalculateBezierPoint(float t, Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3)
{
      float u = 1 - t; 
      float tt = t*t;
      float uu = u*u;
      float uuu = uu * u;
      float ttt = tt * t;

      Vector2 p = uuu * p0; //first term
      p += 3 * uu * t * p1; //second term
      p += 3 * u * tt * p2; //third term
      p += ttt * p3; //fourth term

      return p;
}

其中t是起点和终点之间路径的比率。