Hello Alexandra,

Alexandra Wolyniec wrote:
> Hello!
> I'm trying to form a translation by using functions.
> So I wrote this function to make an easy transformation along the y axis:
>  
> void animation_vertical(Vec3f cube_init_vec, Vec3f cube_end_vec, int 
> frame_total){
>      
>     Matrix cube_move;
>     cube_move.setIdentity();
>     for (frame_current=0; frame_current<=frame_total; frame_current++){
>          beginEditCP(cube_trans, Transform::MatrixFieldMask);
>                int cube_move_y = 
> cube_init_vec.getValues()[1]+(osgabs(cube_end_vec.getValues()[1]-cube_init_vec.getValues()[1])/frame_total*frame_current);
>                cube_move.setTranslate(0,cube_move_y,0);
>                cube_trans->setMatrix(cube_move);
>        endEditCP(cube_trans, Transform::MatrixFieldMask);
>     }
> }

you do not need a loop here. Computer animation works like stop motion 
movies: You set up the scene and take a picture of it, then modify it 
for the next picture. Whether you do the modification in many small 
steps (like in the loop above) or just use the values computed in the 
last iteration of the loop is not visible as no images are taken of the 
intermediate steps.
So, to move an object from A to B over the course of 100 frames, you 
basically do the following:

in keyboard:
run = true;
frame_current = 0;
frame_total   = 100;

in display:
if run == true and frame_current <= frame_total:
   compute a position C as the linear interpolation between A and B, 
based on the ratio of frame_current/frame_total.
   place your object at C

render the scene.

> With the keyboard function I'm activating the type of the animation 
> (because there will be some more animations) and the running of the 
> animation itself. In addition I set the duration of the animation to zero:
>  
> void keyboard(unsigned char k, int x, int y){
>     switch (k){
>         case '1' : run = true;
>                         typ_animation = 1;
>                   dauer = 0;
>                         break;
>         }
> }
>  
> After that I use the display function to let the animation go on. As I 
> have understood this method, this function is being called and called by 
> glutDisplayFunc(display);  in the SetupGlut. (Sorry, after adapting to 
> french my english gets more and more worse :-/) So, that's why I thought 
> it will redraw each new frame position of the animation.

do you also have a glutIdleFunc? That should be a function that just 
calls glutPostRedisplay, because otherwise your display function will 
only be called in reaction to certain "events" that require a refresh of 
the screen content (e.g. resizing/moving the window).
Also, when the user presses a recognized key (like '1') you probably 
also want to issue a glutPostRedisplay.

> void display(void){
>  
>     if(run==true && dauer<300){
>          switch(typ_animation){
>                case 1: animation_vertical(Vec3f(0,5,0), Vec3f(0,20,0), 
> dauer);
>                break;
>            }
>         dauer++;
>         }
>        mgr->redraw();
>     }
> }
>  
> All in all, it changes the positions, but it does not show the animation 
> between. Why?! What do I have to change?

My guess would be the lack of a glutIdleFunction, will already display 
the animation. But please also try to understand why the loop in 
animate_vertical is not required.

        Hope it helps,
                Carsten



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to