x


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);

}  
more ▼

asked Mar 06, 2010 at 11:00 PM

mdaustin gravatar image

mdaustin
381 3 7 15

I have edited to the above question to show a now working solution

Mar 06, 2010 at 11:13 PM mdaustin

So helpful!!! Is the 3D version simple?

Jan 12, 2011 at 11:59 PM pickledzebra

CurveZ = (((1-BezierTime)*(1-BezierTime)) * StartPointZ) + (2 * BezierTime * (1 - BezierTime) * ControlPointZ) + ((BezierTime * BezierTime) * EndPointZ); << - add this and you'll have the 3D version. Of course, you'll have to declare the necessary variables for Z.

Feb 01, 2011 at 06:12 AM zannghast

This is a great solution. But I have to ask, how do you control the speed variable? by default, the object is way too fast. Thanks again!

Feb 18, 2011 at 12:54 PM Marvin Hawkins

I hate to do this, but which variables control the speed of how fast the object moves along the curve?

I assume it's Beizertime, but I've attempted to manipulate this variable, and it doesn't seem to slow the object down.

Mar 06, 2011 at 05:42 PM Marvin Hawkins
show all comments (comments are locked)
10|3000 characters needed characters left

4 answers: sort voted first

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.

more ▼

answered Mar 06, 2010 at 11:15 PM

mdaustin gravatar image

mdaustin
381 3 7 15

(comments are locked)
10|3000 characters needed characters left

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

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 ;)

more ▼

answered Jul 25, 2011 at 06:40 PM

Bunny83 gravatar image

Bunny83
74.5k 25 91 319

thanks a lot for this solution, it was really helpful.

Dec 23, 2011 at 03:56 PM flamy
(comments are locked)
10|3000 characters needed characters left

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

more ▼

answered Dec 21, 2010 at 10:25 PM

pixelboi gravatar image

pixelboi
13 6 4 5

(comments are locked)
10|3000 characters needed characters left

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!

more ▼

answered Jul 21, 2013 at 12:27 PM

dentedpixel gravatar image

dentedpixel
368 1 8

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2123
x41

asked: Mar 06, 2010 at 11:00 PM

Seen: 21839 times

Last Updated: Jul 10 at 11:30 AM