最近想做一个类似曲线指示器的东西,搜了一下资料发现这个,记录一下。
简介
贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。
一条贝塞尔曲线有着n个控制点,曲线上的每个点由公式推算出来。n个控制点对应着n-1次的贝塞尔曲线。
一阶曲线
二阶曲线
..三阶以上我就不写了,写公式好麻烦
实现
话不多说,直接开始实现
///
/// 计算二次贝塞尔曲线值
///
/// t值
/// 起始点
/// 控制点
/// 目标点
///
private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
// B(t) = (1 - t)^2*p0 + 2t(1 - t)p1 + t^2*p2
Vector3 p = uu * p0;
p += 2 * u * t * p1;
p += tt * p2;
return p;
}
有了能计算2阶贝塞尔曲线的函数了,下一步就是变换t值,求出每一个点。
///
/// 给定中间点个数,给出每个点的坐标
///
/// 起始点
/// 控制点
/// 目标点
/// 中间点个数
///
public Vector3[] GetBeizrList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)
{
Vector3[] path = new Vector3[segmentNum];
for(int i = 1; i <= segmentNum; i++)
{
float t = i / (float)segmentNum;
Vector3 pixel = CalculateCubicBezierPoint(t, startPoint, controlPoint, endPoint);
// 设置linerenderer达到画线的目的
lineRenderer.positionCount = i;
lineRenderer.SetPosition(i - 1, pixel);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
这样,给点三个点就能够完整画出一条直线,排版有些乱,先这样吧。