我正在使用下面的代码创建 Bézier 曲线,该代码是从 这里获得的。我还制作了一个BezierPair
游戏对象,它有两条贝塞尔曲线作为子对象。
从下面的相应图像和 BezierPair,其中points[0]
...points[3]
表示为P0
... P3
:
我希望P0
每条贝塞尔曲线在移动时始终保持不变。换句话说,我希望它们始终一起移动,并可以选择关闭此移动。
说P1
两条曲线是分开的。我怎样才能使P1
每条曲线在相同的方向上移动,覆盖相同的距离?
说P2
两条曲线是分开的。如何沿连接和的线制作另 P2
一条曲线的一个曲线镜像?请注意,镜像线将取自以下示例中的曲线 1,因为's已移动。如果's被移动,那么镜像线将从's 中取出。P2
P0
P3
curve1
P2
curve2
P2
curve2
P0P3
我不想在运行时这样做。所以必须使用自定义编辑器。我尝试在下面的代码中解决 1. 但如果没有我在层次结构窗口中选择 BezierPair,第二条曲线的位置就不会更新
贝塞尔:
public static class Bezier {
public static Vector3 GetPoint (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
t = Mathf.Clamp01(t);
float oneMinusT = 1f - t;
return
oneMinusT * oneMinusT * oneMinusT * p0 +
3f * oneMinusT * oneMinusT * t * p1 +
3f * oneMinusT * t * t * p2 +
t * t * t * p3;
}
public static Vector3 GetFirstDerivative (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
t = Mathf.Clamp01(t);
float oneMinusT = 1f - t;
return
3f * oneMinusT * oneMinusT * (p1 - p0) +
6f * oneMinusT * t * (p2 - p1) +
3f * t * t * (p3 - p2);
}
}
贝塞尔曲线:
[RequireComponent(typeof(LineRenderer))]
public class BezierCurve : MonoBehaviour {
public Vector3[] points;
LineRenderer lr;
public int numPoints = 49;
bool controlPointsChanged = false;
bool isMoving = false;
public void Reset () {
points = new Vector3[] {
new Vector3(1f, 0f, 0f),
new Vector3(2f, 0f, 0f),
new Vector3(3f, 0f, 0f),
new Vector3(4f, 0f, 0f)
};
}
void Start() {
lr = GetComponent<LineRenderer> ();
lr.positionCount = 0;
DrawBezierCurve ();
}
public Vector3 GetPoint (float t) {
return transform.TransformPoint(Bezier.GetPoint(points[0], points[1], points[2], points[3], t));
}
public void DrawBezierCurve () {
lr = GetComponent<LineRenderer> ();
lr.positionCount = 1;
lr.SetPosition(0, points[0]);
for (int i = 1; i < numPoints+1; i++) {
float t = i / (float)numPoints;
lr.positionCount = i+1;
lr.SetPosition(i, GetPoint(t));
}
}
相关分类