unity-code-Bezier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
public Transform[] arrTf ;

public Transform tf;
private float runTime;

// Start is called before the first frame update
void Start()
{
}

// Update is called once per frame
void Update()
{
this.runTime += Time.deltaTime;

if (this.runTime >= 1)
{
this.runTime -= 1;
}

List<Transform> listTf = new List<Transform>(this.arrTf);
Vector3 v3 = Bezier(this.runTime, listTf);

this.tf.position = v3;

}

// 线性公式
public Vector3 Bezier(Vector3 p0, Vector3 p1, float t)
{
return (1 - t) * p0 + t * p1;
}

// 二阶曲线
public Vector3 Bezier(Vector3 p0, Vector3 p1, Vector3 p2, float t)
{
Vector3 p0p1 = (1 - t) * p0 + t * p1;
Vector3 p1p2 = (1 - t) * p1 + t * p2;
Vector3 result = (1 - t) * p0p1 + t * p1p2;
return result;
}



// 三阶曲线
public Vector3 Bezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
Vector3 result;
Vector3 p0p1 = (1 - t) * p0 + t * p1;
Vector3 p1p2 = (1 - t) * p1 + t * p2;
Vector3 p2p3 = (1 - t) * p2 + t * p3;
Vector3 p0p1p2 = (1 - t) * p0p1 + t * p1p2;
Vector3 p1p2p3 = (1 - t) * p1p2 + t * p2p3;
result = (1 - t) * p0p1p2 + t * p1p2p3;
return result;
}

// n次方公式
public Vector3 Bezier(float t, List<Vector3> p)
{
if (p.Count < 2)
return p[0];

List<Vector3> newp = new List<Vector3>();
for (int i = 0; i < p.Count - 1; i++)
{
// Debug.DrawLine(p[i], p[i + 1]);
Vector3 p0p1 = (1 - t) * p[i] + t * p[i + 1];
newp.Add(p0p1);
}

return Bezier(t, newp);
}

// transform转换为vector3,在调用参数为List<Vector3>的Bezier函数
public Vector3 Bezier(float t, List<Transform> p)
{
if (p.Count < 2)
return p[0].position;
List<Vector3> newp = new List<Vector3>();
for (int i = 0; i < p.Count; i++)
{
newp.Add(p[i].position);
}
return Bezier(t, newp);
}


private void OnDrawGizmos()
{
if (this.arrTf.Length < 4)
{
return;
}

for(int i = 0; i < this.arrTf.Length; i++)
{
if(this.arrTf[i] == null)
{
return;
}
}

List<Transform> listTf = new List<Transform>(this.arrTf);

for(float i = 0; i < 1; i+= 0.01f)
{
//Vector3 v3 = Bezier(this.arrTf[0].position, this.arrTf[1].position, i);
//Vector3 v4 = Bezier(this.arrTf[0].position, this.arrTf[1].position, i + 0.01f);

//Vector3 v3 = Bezier(this.arrTf[0].position, this.arrTf[1].position, this.arrTf[2].position, i);
//Vector3 v4 = Bezier(this.arrTf[0].position, this.arrTf[1].position, this.arrTf[2].position, i + 0.01f);

//Vector3 v3 = Bezier(this.arrTf[0].position, this.arrTf[1].position, this.arrTf[2].position, this.arrTf[3].position, i);
//Vector3 v4 = Bezier(this.arrTf[0].position, this.arrTf[1].position, this.arrTf[2].position, this.arrTf[3].position, i + 0.01f);

Vector3 v3 = Bezier(i, listTf);
Vector3 v4 = Bezier(i + 0.01f, listTf);

Gizmos.DrawLine(v3, v4);
}

}
}