概述
1.贝塞尔曲线是什么?
贝塞尔曲线(bezier curve),又叫贝兹曲线/贝济埃曲线,本质上就是一段二维图形应用程序的数学曲线。它分为端点和线段两部分,节点是可拖动的支点,线段像可伸缩的皮筋。
2.它可以做什么?
PS中的钢笔工具,部分游戏的道具飞行路径等
3.三阶贝塞尔曲线效果展示
贝塞尔曲线原理
1.什么是阶?
拿上面的效果图举例,我说了三阶贝塞尔曲线效果展示。那么什么是三阶呢?
两种理解:
1.贝塞尔曲线是一个数学函数,那么N阶贝塞尔曲线就可以理解为N次方的意思,那么上面的三阶贝塞尔曲线就是三次方比塞尔曲线。
2.三阶贝塞尔曲线就是在二阶贝塞尔曲线上在加一次一阶贝塞尔曲线,以此类推。
2.贝塞尔曲线的公式
- 一阶贝塞尔曲线
一阶贝塞尔曲线其实就是一个线段,给出两个点 P0,P1
P’ = P0 + (P1 - P0)t = tP2 + (1-t)P0 , t∈[0,1];
P0,P2已经很明确了,t是什么呢?
t是(0-1)的一个值,那么根据t就可知一阶贝塞尔曲线的t这个系数 P’ 是多少了
- 二阶贝塞尔曲线
二阶贝塞尔曲线,既然是二阶贝塞尔曲线那么就会有三个点 P0,P1,P2
同时拟定两个 P(A),P(B) 点在P1P2,P2P3两段线段上
P’ = P(A) + (P(B) - P(A))t , t属于[0,1]
P(A) = P0 + (P1 - P0)t , P(B) = P1 + (P2 - P1)t , t∈[0,1]
∴ P’ = (1-t)P0 + 2t(1-t)P1 + t²P3 , t属于[0,1]
TrueType字型就运用了以贝兹样条组成的二次贝兹曲线。
- 三阶贝塞尔曲线
P0、P1、P2、P4四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P1走向P2,并从P3的方向来到P4。一般不会经过P2或P3;这两个点只是在那里提供方向资讯。P1和P2之间的间距,决定了曲线在转而趋进P4之前,走向P3方向的“长度有多长”。
公式为:
- n阶贝塞尔曲线
现代的成象系统,如PostScript、Asymptote和Metafont,运用了以贝兹样条组成的三次贝兹曲线,用来描绘曲线轮廓。一般参数公式阶贝兹曲线可如下推断。
给定点P0、P1、…、Pn,其贝兹曲线即:
相关代码
- 一阶贝塞尔曲线代码
/// <summary>
/// 一阶贝塞尔曲线代码
/// </summary>
/// <param name="pos1"> P0 </param>
/// <param name="pos2"> P1 </param>
/// <param name="step"> t </param>
/// <returns> </returns>
private Vector3 _CalculateBezierPoint(Vector3 pos1,Vector3 pos2,float step)
{
return pos1 + (pos2 - pos1) * step;
}
既然有了一阶的贝塞尔曲线代码,那么n阶自然就可以根据递归来计算出来:
/// <summary>
/// N阶贝塞尔曲线代码
/// </summary>
/// <param name="t"> t </param>
/// <param name="posArr"> P0,P1,P2,P3... </param>
/// <returns></returns>
public Vector3 GetBezierPoint(float t,[NotNull]params Vector3[] posArr)
{
if (posArr.Length < 2)
{
if (posArr.Length <= 0)
{
return Vector3.zero;
}
else if(posArr.Length == 1)
{
return posArr[0];
}
else
{
return _CalculateBezierPoint(posArr[0],posArr[1],t);
}
}
List<Vector3> tempList = new();
for (int i = 1; i < posArr.Length; i++)
{
tempList.Add(_CalculateBezierPoint(posArr[i - 1],posArr[i],t));
}
return GetBezierPoint(t, tempList.ToArray());
}