# Smooth motion to a square

This topic is 3849 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi! I need to translate a square from a place to another. The problem is the translate can´t be direct, it as to seem that the square is moving from a place to another. I know that glTranslate moves the square from a olace to another, but without any motion... How can i create the motion? Can anyone help me please? Thank You.

##### Share on other sites
Instead of suddenly changing the position from here to there, do many smaller translations over time until the goal position is reached. Each translation step has to be done obviously in direction to the goal position. E.g. if you start at position s and the goal position g has to be reached in T seconds by a linear motion, then at a time t the current position will be
p(t) := s + t / T * ( g - s ) , 0 <= t <= T

[Edited by - haegarr on December 5, 2007 1:00:33 PM]

##### Share on other sites
Quote:
 Original post by haegarrInstead of suddenly changing the position from here to there, do many smaller translations over time until the goal position is reached. Each translation step has to be done obviously in direction to the goal position. E.g. if you start at position s and the goal position g has to be reached in T seconds by a linear motion, then at a time t the current position will bep(t) := s + t / T * ( g - s ) , 0<=t<=T

Yes, i know that's what i have to do, but i don´t know how...
First, i used the glTranslatef and it make the motion, but it was drawing square on top of a square... and i want to draw a new one, but delete the old one.
I´m using the glTranslatef inside a FOR cycle.

I believe i have to use the glPushMatrix and glPopMatrix, but i can´t understand how...

##### Share on other sites
You need a "render loop", e.g. in some C like pseudo-code:
timestamp atStart = nowInSeconds();int t;do {   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   t = nowInSeconds() - atStart;   vector diff = goal - start;   diff *= t / T;   glTranslatefv(diff);   swapBuffers(); // system dependent; see WGL, GLX, CGL, or whatever you use} while(t < T);
assuming that the square is already located at "start" when beginning.

EDIT: Above "start" and "goal" are of course vectors, as can be assumed by the type "vector" of diff. If you don't have a vector class at hand (or use a non OO language) you have to substitute it with something equivalent, like
struct {   float x,y,z;} vector;timestamp atStart = nowInSeconds();int t;do {   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);   t = nowInSeconds() - atStart;   vector diff;   diff.x = ( goal.x - start.x ) * t/T;   diff.y = ( goal.y - start.y ) * t/T;   diff.z = ( goal.z - start.z ) * t/T;   glTranslatefv(diff);   swapBuffers(); // system dependent; see WGL, GLX, CGL, or whatever you use} while(t < T);

EDIT: swapBuffers() added in code snippets

[Edited by - haegarr on December 6, 2007 5:26:17 AM]

##### Share on other sites
Quote:
 Original post by PaultergeistI believe i have to use the glPushMatrix and glPopMatrix, but i can´t understand how...

glPushMatrix and glPopMatrix are appropriate when local co-ordinate spaces play a role. They can be used in general as long as you hasn't started to render a new frame.1 Here you are playing an animation that naturally is required to last over several frames, so push/pop doesn't help you. I recommend you to track things like animated positions always in your own code instead of relying on OpenGL's matrix stack!

1You _can_ solve the problem by using push/pop, but it would be more an academic solution since it will not be possible any more when the rendered scene becomes more complex.

##### Share on other sites
Thanks a lof for the helps!

You have all been very usefull!

• 48
• 12
• 10
• 10
• 9
• ### Forum Statistics

• Total Topics
631374
• Total Posts
2999654
×