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 4 8 21

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

did you ever find a solution to changing the end points to start points and continuing the curve creation from there? That would be an interesting thing to share if you had :-). Thanks for sharing your solution

Mar 17, 2011 at 02:14 PM 3Duaun
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 4 8 21

(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
79.5k 27 110 350

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 6

(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 2 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:

x2230
x43

asked: Mar 06, 2010 at 11:00 PM

Seen: 23137 times

Last Updated: Jul 10 at 11:30 AM