如何在使用自定义编辑器移动一条贝塞尔曲线时更新一条贝塞尔曲线

我正在使用下面的代码创建 Bézier 曲线,该代码是从 这里获得的。我还制作了一个BezierPair游戏对象,它有两条贝塞尔曲线作为子对象。

从下面的相应图像和 BezierPair,其中points[0]...points[3]表示为P0... P3

  1. 我希望P0每条贝塞尔曲线在移动时始终保持不变。换句话说,我希望它们始终一起移动,并可以选择关闭此移动。

http://img2.mukewang.com/60d6daf100013eca06460248.jpg

  1. P1两条曲线是分开的。我怎样才能使P1每条曲线在相同的方向上移动,覆盖相同的距离?

http://img3.mukewang.com/60d6dafc00017a2103290248.jpg

  1. P2两条曲线是分开的。如何沿连接和的线制作另 P2一条曲线的一个曲线镜像?请注意,镜像线将取自以下示例中的曲线 1,因为's已移动。如果's被移动,那么镜像线将从's 中取出。P2P0P3curve1P2curve2P2curve2P0P3

http://img1.mukewang.com/60d6db0b0001246803270286.jpg

我不想在运行时这样做。所以必须使用自定义编辑器。我尝试在下面的代码中解决 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));

}

}


斯蒂芬大帝
浏览 173回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP