unity 贝塞尔曲线
前段时间研究贝塞尔曲线,做曲线路径动画
其实原理还是简单的做差值算法
private void InstBezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
if (p0 == null || p1 == null || p2 == null || p3 == null)
{
isInsted = false;
return;
}
for (int i = 0; i < pointNum; i++)
{
float ratio = i / (float)pointNum;
Vector3 p0_1 = Vector3.Lerp(p0, p1, ratio);
Vector3 p1_2 = Vector3.Lerp(p1, p2, ratio);
Vector3 p2_3 = Vector3.Lerp(p2, p3, ratio);
Vector3 p0_1_1_2 = Vector3.Lerp(p0_1, p1_2, ratio);
Vector3 P1_2_2_3 = Vector3.Lerp(p1_2, p2_3, ratio);
Vector3 p0_1_1_2_1_2_2_3 = Vector3.Lerp(p0_1_1_2, P1_2_2_3, ratio);
pointList.Add(p0_1_1_2_1_2_2_3);
}
isInsted = true;
}
再帖一段物体追踪曲线轨迹的代码
private Vector3 Vector3ListLerp(float t)
{
if (t > 1)
{
t = 1;
}
float disRatio = bezierPath.totalDis * t;//已经跑了的距离
float pointsDis = 0;
float ratio = 0;
for (int i = 0; i < bezierPath.pointList.Count - 1; i++)
{
float pointDis = Vector3.Distance(bezierPath.pointList[i], bezierPath.pointList[i + 1]);
pointsDis += pointDis;
if (pointsDis >= disRatio)
{
currentPoint = bezierPath.pointList[i];
nextPoint = bezierPath.pointList[i + 1];
ratio = (disRatio - (pointsDis - pointDis)) / pointDis;
break;
}
}
return Vector3.Lerp(currentPoint, nextPoint, ratio);
}
代码解释。。就是一张图。。