[Unity基础]贝塞尔曲线

参考链接:

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());
	}
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值