贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。
贝塞尔曲线工具类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BezierUtils
{
/// <summary>
/// 根据T值,计算贝塞尔曲线上面相对应的点
/// </summary>
/// <param name="t"></param>T值
/// <param name="p0"></param>起始点
/// <param name="p1"></param>控制点
/// <param name="p2"></param>目标点
/// <returns></returns>根据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;
Vector3 p = uu * p0;
p += 2 * u * t * p1;
p += tt * p2;
return p;
}
/// <summary>
/// 获取存储贝塞尔曲线点的数组
/// </summary>
/// <param name="startPoint"></param>起始点
/// <param name="controlPoint"></param>控制点
/// <param name="endPoint"></param>目标点
/// <param name="segmentNum"></param>采样点的数量
/// <returns></returns>存储贝塞尔曲线点的数组
public static Vector3[] GetBeizerList(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);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
}
贝塞尔曲线的用法:
//using UnityEngine;
//using System.Collections.Generic;
//[RequireComponent(typeof(LineRenderer))]
//public class Bezier : MonoBehaviour
//{
// public Transform[] controlPoints;
// public LineRenderer lineRenderer;
// private int layerOrder = 0;
// private int _segmentNum = 5000;
// void Start()
// {
// if (!lineRenderer)
// {
// lineRenderer = GetComponent<LineRenderer>();
// }
// lineRenderer.sortingLayerID = layerOrder;
// }
// void Update()
// {
// DrawCurve();
// }
// void DrawCurve()
// {
// for (int i = 1; i <= _segmentNum; i++)
// {
// float t = i / (float)_segmentNum;
// int nodeIndex = 0;
// Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position,
// controlPoints[nodeIndex + 1].position, controlPoints[nodeIndex + 2].position);
// lineRenderer.positionCount = i;
// lineRenderer.SetPosition(i - 1, pixel);
// }
// }
// Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
// {
// float u = 1 - t;
// float tt = t * t;
// float uu = u * u;
// Vector3 p = uu * p0;
// p += 2 * u * t * p1;
// p += tt * p2;
// return p;
// }
//}
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(LineRenderer))]
public class Bezier : MonoBehaviour
{
public Transform[] controlPoints;
public LineRenderer lineRenderer;
private int curveCount = 0;
private int layerOrder = 0;
private int SEGMENT_COUNT = 50;
void Start()
{
if (!lineRenderer)
{
lineRenderer = GetComponent<LineRenderer>();
}
lineRenderer.sortingLayerID = layerOrder;
curveCount = (int)controlPoints.Length / 3;
}
void Update()
{
DrawCurve();
}
void DrawCurve()
{
for (int j = 0; j < curveCount; j++)
{
for (int i = 1; i <= SEGMENT_COUNT; i++)
{
float t = i / (float)SEGMENT_COUNT;
int nodeIndex = j * 3;
Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position, controlPoints[nodeIndex + 1].position, controlPoints[nodeIndex + 2].position, controlPoints[nodeIndex + 3].position);
lineRenderer.SetVertexCount(((j * SEGMENT_COUNT) + i));
lineRenderer.SetPosition((j * SEGMENT_COUNT) + (i - 1), pixel);
}
}
}
Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
float uuu = uu * u;
float ttt = tt * t;
Vector3 p = uuu * p0;
p += 3 * uu * t * p1;
p += 3 * u * tt * p2;
p += ttt * p3;
return p;
}
}