这里有很多小伙伴可能不知道啥事贝塞尔曲线是啥玩意,如果你用过PS的钢笔功能就知道这是啥,如果还是不知道这是啥那么说一个游戏你就知道了“愤怒的小鸟”这个游戏用到弹弓效果可以用这个贝塞尔曲线来实现。还不知道的话拿自己去百度谷歌,这个是游戏很常用到的一个画曲线的函数方式。
那么我们要实现贝塞尔曲线函数要怎么弄了,别把贝塞尔曲线想的太难,其实如果你懂得怎么贝塞尔曲线的公式怎么写,那么这个其实将数学公式转化成代码语言就行了。那么我们先去看看贝塞尔曲线公式有哪些,下图是百度百科对贝塞尔曲线的介绍并且其中还包括公式,有兴趣的娃可以去百科看看这些介绍,地址如下:点击打开链接
从上图我们可以看出大体上用法有3种,如果看不懂这些不要紧,这里我们把P1,P2等可以看作参数,t可以看作一个0-1的参数这样将其化作简单代码语言来看待,那么我们可以根据参数多少大体知道有3个不同的参数的函数。接下来我们继续往下把贝塞尔曲线函数实现出来,这里写成了静态函数方便调用,因为很简单所以就直接上代码了,如果连将数学公式转化为简单的代码语言都不会,怎么你可要慎重考虑是否适合做这行了,代码如下:
using UnityEngine;
[System.Serializable]
public class Bezier : System.Object
{
/// <summary>
/// 线性贝赛尔曲线
/// </summary>
/// <param name="P0"></param>
/// <param name="P1"></param>
/// <param name="t"> 0.0 >= t <= 1.0 </param>
/// <returns></returns>
public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, float t)
{
Vector3 B = Vector3.zero;
float t1 = (1 - t);
B = t1*P0 + P1*t;
//B.y = t1*P0.y + P1.y*t;
//B.z = t1*P0.z + P1.z*t;
return B;
}
/// <summary>
///
/// </summary>
/// <param name="P0"></param>
/// <param name="P1"></param>
/// <param name="P2"></param>
/// <param name="t">0.0 >= t <= 1.0 </param>
/// <returns></returns>
public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, float t)
{
Vector3 B = Vector3.zero;
float t1 = (1 - t)*(1 - t);
float t2 = t*(1 - t);
float t3 = t*t;
B = P0*t1 + 2*t2*P1 + t3*P2;
//B.y = P0.y*t1 + 2*t2*P1.y + t3*P2.y;
//B.z = P0.z*t1 + 2*t2*P1.z + t3*P2.z;
return B;
}
/// <summary>
///
/// </summary>
/// <param name="P0"></param>
/// <param name="P1"></param>
/// <param name="P2"></param>
/// <param name="P3"></param>
/// <param name="t">0.0 >= t <= 1.0 </param>
/// <returns></returns>
public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, Vector3 P3, float t)
{
Vector3 B = Vector3.zero;
float t1 = (1 - t)*(1 - t)*(1 - t);
float t2 = (1 - t)*(1 - t)*t;
float t3 = t*t*(1 - t);
float t4 = t*t*t;
B = P0*t1 + 3*t2*P1 + 3*t3*P2 + P3*t4;
//B.y = P0.y*t1 + 3*t2*P1.y + 3*t3*P2.y + P3.y*t4;
//B.z = P0.z*t1 + 3*t2*P1.z + 3*t3*P2.z + P3.z*t4;
return B;
}
}
一般公式是教你怎么使用公式,这里我们可以忽略掉的。这里要注意的是,我们是通过t来绘制到曲线的每一个点位置,但是要记得t是一个0到1值,所以可以利用for循环来绘制所需要的点,大体用法就如图所示:
这里要感谢Momo大神,界面大部分代码都是用Momo写个那个案例,原文地址:点击打开链接
最后的效果如图显示: