Unity使用贝塞尔曲线

来源:互联网 发布:工艺方案优化 编辑:程序博客网 时间:2024/05/16 11:45

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 + v2public 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.0public 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 changedprivate 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

0 0
原创粉丝点击