UNITY贝塞尔曲线Bezier的一个细节

最近研究AI飞行轨迹需要贝塞尔曲线的相关知识,查阅网上的资料后发现了一个被引用多次的C#贝塞尔函数代码

[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;
			
		}
		
	}
	
}
这个Bezier曲线构造函数由4个Vector3类型参数构成,分别是起点v0,起点控制点v1,终点控制点v2,终点控制点v3,有一个需要注意的地方就是v0和v3是游戏的世界坐标,而v1,v2(控制点)是相对于其控制的点的相对坐标。

如果要控制点也在世界坐标系中设定,只需要进行简单的修改即可。

public Bezier( Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3 )
//世界坐标系的Bezier曲线构造函数
	{
		
		this.p0 = v0;
		
		this.p1 = v1 - v0;
		
		this.p2 = v2 - v3;
		
		this.p3 = v3;
		
	}



你可能感兴趣的:(学习,unity,贝塞尔曲线)