Moving an Object along a Bezier Curve

I have the following code which is attempting to move an object along a path of 3 defined points using my interpretation (which is most likely the problem) of a Bezier curve. I am aiming longterm to change the EndPoint variables to the StartPoint variables to start a new curve from the end of this one.

I have solved the problem I had and this code now works for anyone who wants the same kind of effect.

var StartPointX: float = 0;
var StartPointY: float = 0;
var ControlPointX: float = 20;
var ControlPointY: float = 50;
var EndPointX : float = 50;
var EndPointY : float = 0;
var CurveX:float;
var CurveY: float;
var BezierTime: float = 0;
var mySphere: Transform;

function Update()
{
    BezierTime = BezierTime + Time.deltaTime;

    if (BezierTime >= 1)
    {
        BezierTime = 0;
    }

    CurveX = (((1-BezierTime)*(1-BezierTime)) * StartPointX) + (2 * BezierTime * (1 - BezierTime) * ControlPointX) + ((BezierTime * BezierTime) * EndPointX);
    CurveY = (((1-BezierTime)*(1-BezierTime)) * StartPointY) + (2 * BezierTime * (1 - BezierTime) * ControlPointY) + ((BezierTime * BezierTime) * EndPointY);
    transform.position = Vector3(CurveX, CurveY, 0);

}

The original question was a mistyping of the actual equation. I have changed the code so that it is now workable for anyone whom wants to adapt or use it.

Well, just found this question, i know you got it to work but you’ve heard about Vector2 / Vector3 and functions?

// UnityScript
function Bezier2(Start : Vector2, Control : Vector2, End : Vector2 , t :float) : Vector2
{
    return (((1-t)*(1-t)) * Start) + (2 * t * (1 - t) * Control) + ((t * t) * End);
}

function Bezier2(Start : Vector3, Control : Vector3, End : Vector3 , t :float) : Vector3
{
    return (((1-t)*(1-t)) * Start) + (2 * t * (1 - t) * Control) + ((t * t) * End);
}

function Bezier3(s : Vector2, st : Vector2, et : Vector2, e : Vector2, t : float) : Vector2
{
    return (((-s + 3*(st-et) + e)* t + (3*(s+et) - 6*st))* t + 3*(st-s))* t + s;
}

function Bezier3(s : Vector3, st : Vector3, et : Vector3, e : Vector3, t : float) : Vector3
{
    return (((-s + 3*(st-et) + e)* t + (3*(s+et) - 6*st))* t + 3*(st-s))* t + s;
}

That’s are two versions: a quadratic bezier(one control point) and a cubic bezier(two control points). Each comes in two versions: Vector2 and Vector3.

The cubic equatation is transformed so you don’t have those ugly (1-t)(1-t)(1-t). When you just multiply the brackets you get (1 + (-3 +(3-t)*t)*t) which looks even more ugly but with the other terms it resolves quite nicely :wink:

edit

//C#
public static Vector2 Bezier2(Vector2 Start, Vector2 Control, Vector2 End, float t)
{
    return (((1-t)*(1-t)) * Start) + (2 * t * (1 - t) * Control) + ((t * t) * End);
}

public static Vector3 Bezier2(Vector3 Start, Vector3 Control, Vector3 End, float t)
{
    return (((1-t)*(1-t)) * Start) + (2 * t * (1 - t) * Control) + ((t * t) * End);
}

public static Vector2 Bezier3(Vector2 s, Vector2 st, Vector2 et, Vector2 e, float t)
{
    return (((-s + 3*(st-et) + e)* t + (3*(s+et) - 6*st))* t + 3*(st-s))* t + s;
}

public static Vector3 Bezier3(Vector3 s, Vector3 st, Vector3 et, Vector3 e, float t)
{
    return (((-s + 3*(st-et) + e)* t + (3*(s+et) - 6*st))* t + 3*(st-s))* t + s;
}

You can also use a tweening class like LeanTween to accomplish the same effect:

LeanTween.move( gameObject, [pt1, control2, control3, pt4], 1.0 );

You can also chain different paths together very easily, like

LeanTween.move( gameObject, [pt1, control2, control3, pt4, pt4, control5, control6, pt7..... etc], 1.0 );

And if you do not wish it to move at a constant speed you can pass an easing function like:

LeanTween.move( gameObject, [pt1, control2, control3, pt4], 1.0, {"ease":LeanTweenType.easeInOutQuad} );

Just a hint for anyone out there who doesn’t want to have to write their own bezier interpreting code!

Do I just add this to a cube or sphere to text? What do I use for the transform? I tried adding the script to an empty game object. Then I draged the cube to the "Transform" zeroed the "Y' values. I get nothing. Help please.

Thanks