Unity使用贝塞尔曲线

Unity使用贝塞尔曲线,网络上已经有很多帖子了,我这里主要就是转载下,多谢。

 

贝塞尔曲线计算脚本:通过GetPointAtTime()获取数据

using UnityEngine;
using System.Collections;

[System.Serializable]
public class Bezier : System.Object
	
{
	
	public Vector3 p0;
	
	public Vector3 p1;
	
	public Vector3 p2;
	
	public Vector3 p3;
	
	public float ti = 0f;
	
	private Vector3 b0 = Vector3.zero;
	
	private Vector3 b1 = Vector3.zero;
	
	private Vector3 b2 = Vector3.zero;
	
	private Vector3 b3 = Vector3.zero;
	
	private float Ax;
	
	private float Ay;
	
	private float Az;
	
	private float Bx;
	
	private float By;
	
	private float Bz;
	
	private float Cx;
	
	private float Cy;
	
	private float Cz;
	
	// Init function v0 = 1st point, v1 = handle of the 1st point , v2 = handle of the 2nd point, v3 = 2nd point
	
	// handle1 = v0 + v1
	
	// handle2 = v3 + v2
	
	public Bezier( Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3 )
		
	{
		
		this.p0 = v0;
		
		this.p1 = v1;
		
		this.p2 = v2;
		
		this.p3 = v3;
		
	}
	
	// 0.0 >= t <= 1.0
	
	public Vector3 GetPointAtTime( float t )
		
	{
		
		this.CheckConstant();
		
		float t2 = t * t;
		
		float t3 = t * t * t;
		
		float x = this.Ax * t3 + this.Bx * t2 + this.Cx * t + p0.x;
		
		float y = this.Ay * t3 + this.By * t2 + this.Cy * t + p0.y;
		
		float z = this.Az * t3 + this.Bz * t2 + this.Cz * t + p0.z;
		
		return new Vector3( x, y, z );
		
	}
	
	private void SetConstant()
		
	{
		
		this.Cx = 3f * ( ( this.p0.x + this.p1.x ) - this.p0.x );
		
		this.Bx = 3f * ( ( this.p3.x + this.p2.x ) - ( this.p0.x + this.p1.x ) ) - this.Cx;
		
		this.Ax = this.p3.x - this.p0.x - this.Cx - this.Bx;
		
		this.Cy = 3f * ( ( this.p0.y + this.p1.y ) - this.p0.y );
		
		this.By = 3f * ( ( this.p3.y + this.p2.y ) - ( this.p0.y + this.p1.y ) ) - this.Cy;
		
		this.Ay = this.p3.y - this.p0.y - this.Cy - this.By;
		
		this.Cz = 3f * ( ( this.p0.z + this.p1.z ) - this.p0.z );
		
		this.Bz = 3f * ( ( this.p3.z + this.p2.z ) - ( this.p0.z + this.p1.z ) ) - this.Cz;
		
		this.Az = this.p3.z - this.p0.z - this.Cz - this.Bz;
		
	}
	
	// Check if p0, p1, p2 or p3 have changed
	
	private void CheckConstant()
		
	{
		
		if( this.p0 != this.b0 || this.p1 != this.b1 || this.p2 != this.b2 || this.p3 != this.b3 )
			
		{
			
			this.SetConstant();
			
			this.b0 = this.p0;
			
			this.b1 = this.p1;
			
			this.b2 = this.p2;
			
			this.b3 = this.p3;
			
		}
		
	}
	
}

初始化贝塞尔曲线,得到曲线每一点的坐标数据

using UnityEngine;
public class MyBezier : MonoBehaviour

{
	//????????
    public Bezier myBezier;
	//?????	
	public GameObject Yellowline;
	//?????????
	private LineRenderer YellowlineRenderer;
    //????????????????	
	public float hSliderValue0;
	public float hSliderValue1;
	
    void Start()
    {
    	//??????
		YellowlineRenderer = Yellowline.GetComponent<LineRenderer>();
		//???????????????100?????
		YellowlineRenderer.SetVertexCount(100);
    }
	void OnGUI()
	{
		//????? -5.0 - 5.0???????
		hSliderValue0 = GUI.HorizontalSlider(new Rect(25, 25, 100, 30), hSliderValue0, -5.0F, 5.0F);
		hSliderValue1 = GUI.HorizontalSlider(new Rect(25, 70, 100, 30), hSliderValue1, -5.0F, 5.0F);
	}

    void Update()
    {
    	//??????????????????????????
        myBezier = new Bezier( new Vector3( -5f, 0f, 0f ),  new Vector3( hSliderValue1, hSliderValue0 , 0f ),  new Vector3( 0, 0, 0f ), new Vector3( 5f, 0f, 0f ) );
	
		//??100?????????????
		for(int i =1; i <= 100; i++)
		{
			//??????? 0 - 1 ??????????
			//????????i * 0.01 ????????
			Vector3 vec = myBezier.GetPointAtTime( (float)(i *0.01) );
			//????????? ??????????
			YellowlineRenderer.SetPosition(i -1,vec);
		}
    


【参考】:http://www.xuanyusong.com/archives/1548

【工程下载】:http://pan.baidu.com/s/1bnD5uhx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值