参考链接:
http://baike.baidu.com/link?url=sqxsidG60sHS4_qPdHs74ltRSSbdqrLS2Nf2ourg6VX3_URZmCBWOiae8s8F8l_0lacy-yKYSXGegQPRjFDID_
效果图:
根据4个点确定的曲线
根据3个点确定的曲线
using UnityEngine;
using System.Collections.Generic;
public class Bezier {
public List<Vector3> vertexs;
//vertexCount:值越大则越光滑
public Bezier(Vector3 p0, Vector3 p1, Vector3 p2, float vertexCount)
{
vertexs = new List<Vector3>();
float interval = 1 / vertexCount;
for (int i = 0; i < vertexCount; i++)
{
vertexs.Add(GetPoint(p0, p1, p2, i * interval));
}
}
//vertexCount:值越大则越光滑
public Bezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float vertexCount)
{
vertexs = new List<Vector3>();
float interval = 1 / vertexCount;
for (int i = 0; i < vertexCount; i++)
{
vertexs.Add(GetPoint(p0, p1, p2, p3, i * interval));
}
}
//t在[0,1]范围
private Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, float t)
{
float a = 1 - t;
Vector3 target = p0 * Mathf.Pow(a, 2) + 2 * p1 * t * a + p2 * Mathf.Pow(t, 2);
return target;
}
//t在[0,1]范围
private Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
float a = 1 - t;
Vector3 target = p0 * Mathf.Pow(a, 3) + 3 * p1 * t * Mathf.Pow(a, 2) + 3 * p2 * Mathf.Pow(t, 2) * a + p3 * Mathf.Pow(t, 3);
return target;
}
}
using UnityEngine;
using System.Collections;
public class TestBezier : MonoBehaviour {
private LineRenderer lineRenderer;
public Transform t0;
public Transform t1;
public Transform t2;
public Transform t3;
public int pointAmount = 100;//值越大曲线越平滑
void Start ()
{
lineRenderer = gameObject.AddComponent<LineRenderer>();
lineRenderer.SetVertexCount(pointAmount);
lineRenderer.SetWidth(0.1f, 0.1f);
}
void Update ()
{
//根据四个点画出的曲线
//Bezier bezier = new Bezier(t0.localPosition, t1.localPosition, t2.localPosition, t3.localPosition, pointAmount);
//根据三个点画出的曲线
Bezier bezier = new Bezier(t0.localPosition, t1.localPosition, t2.localPosition, pointAmount);
lineRenderer.SetPositions(bezier.vertexs.ToArray());
}
}