Анимированный куб внутри анимации - PullRequest
1 голос
/ 05 января 2020

Здесь я отображаю куб в разных местах каждый период, но я хотел, чтобы он порождался с переходом и анимацией, например, я хочу, чтобы он был переведен с -1 на +1 как al oop (анимация куба)

    #include <windows.h>
    #include <GL/glut.h>
    #include <math.h>

    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    #include <stdio.h>
    #include <stdlib.h>

    float angle_Rotation = 0;
    float angle_Rotation2 = 0;

    float xx=0.5;
    float yy=0.5;
    float zz=0.5;

    int dx=0;
    int dy=1;
    int dz=0;

    float tabPos[3] = {-4.0,0.0,4.0};

    int cpt=0;

    GLint rings = 50;
    GLint side =50;
    GLdouble inner = 0.5;
    GLdouble outter = 1;

    void init(){
        /* choisir la couleur d'effacement */
        glClearColor(0.0,0.0,0.0,0.0);
        /* Projection et positionement de la camera*/
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(90,1,0.1,100);
        gluLookAt(0,10,8,0,0,0,0,1,0);
    }

    static void Reshape(int width, int height){
        glViewport(0,0,width,height);
    }

    void whatINeed(){
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);


        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
        glRotatef(angle_Rotation, 0.0, 1.0, 0);
        glRotatef(angle_Rotation2, 1.0, 0.0, 0);
    }

    static void cercle(float r){
        float i;
        float PI=3.14;
        glBegin(GL_POLYGON);
        for(i=0;i<2*PI;i+=PI/48){
            glVertex3f(cos(i)*r,sin(i)*r,0.0);
            glVertex3f(cos(i)*r,sin(i)*r,6.0);
        }
        glEnd();
        //glFlush();
    }



    static void KeyPressed(unsigned char touche, int x, int y){

        switch (touche)
        {

          case 'q': ///rotaion � gauche
                angle_Rotation = angle_Rotation + 2;
                break;

          case 'd': ///rotaion � droite
                angle_Rotation = angle_Rotation - 2;
                break;

          case 'z': ///rotaion � gauche
                angle_Rotation2 = angle_Rotation2 + 2;
                break;

          case 's': ///rotaion � droite
                angle_Rotation2 = angle_Rotation2 - 2;
                break;
        }

        glutPostRedisplay();
    }


    void light(void){
        glEnable(GL_LIGHTING);
        //glEnable(GL_COLOR_MATERIAL);
        GLfloat light_couleur1[] = {0.7,0.5,0.6,0.7};
        GLfloat light_couleur2[] = {0.7,0.7,0.5,0.7};
        //GLfloat light_couleur3[] = {0.7,0.3,1.0,1.0};
        //GLfloat light_position[] = {0.0,1.0,0.5,0.5};
        GLfloat light_position2[] = {0.0,1.0,0.5,0.0};
        GLfloat obj_shine[] = {50.0};

        glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
        glLightfv(GL_LIGHT1,GL_AMBIENT,light_couleur1);
        glLightfv(GL_LIGHT1,GL_DIFFUSE,light_couleur2);
        //glLightfv(GL_LIGHT4,GL_SPECULAR,light_couleur2);
        //glMaterialfv(GL_FRONT,GL_DIFFUSE,light_couleur2);
        glMaterialfv(GL_FRONT,GL_SPECULAR,light_couleur2);
        //glMaterialfv(GL_FRONT,GL_SHININESS,obj_shine);
        glEnable(GL_LIGHT1);
    }



    void table(void){

        glColor3f(0.6,0.0,0.6);
        glPushMatrix(); // Cube
        glTranslatef(0,0,0.0);
        glScalef(4,1,4);    // Scale Sur X et Z (Réctangle)
        glutSolidCube(3);
        glPopMatrix();

        glColor3f(0.3,0.0,0.8);
        glPushMatrix(); // Sphere
        glTranslatef(-4,1.2,-4);  // Ligne Haut Gauche
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(0,1.2,-4);   // Ligne haut Milieu
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(4,1.2,-4);   // Ligne haut droite
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();


        glPushMatrix();
        glTranslatef(-4,1.2,0);   // Ligne Milieu droite
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(0,1.2,0);    // Ligne Milieu Milieu
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(4,1.2,0);    // Ligne Milieu Gauche
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(-4,1.2,4);   // Ligne Bas droite
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(0,1.2,4);    // Ligne Bas milieu
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

        glPushMatrix();
        glTranslatef(4,1.2,4);    // Ligne Bas gauche
        glRotatef(90,1,0,0);
        glutSolidTorus(inner,outter,side,rings);
        glPopMatrix();

    }


    void taupe(void){

        glPushMatrix();
        glTranslatef(tabPos[dx],dy,tabPos[dz]);   // Ligne Milieu droite
        glColor3f(0.8,0.3,0.5);
        glutSolidCube(2);
        glPopMatrix();

    }

в этой функции spawn, мне нужно обновить dy, я должен сделать его от -1 до 1 с 0,05 как шаг, проблема в том, что когда я добавляю код, я теряю свою основную анимацию

 void spawn(void){
        if(cpt%500000==0){
            if(cpt>500000){
                cpt=0;
            }
            dx = rand() % 3; //generates a ra

случайное число от 0 до 2 dz = rand ()% 3; // генерирует случайное число от 0 до 3

        glutPostRedisplay();
    }
    cpt++;

}

void display(){

    whatINeed();

    table();
    taupe();
    glutSwapBuffers();

    }

    int main(){

        // Considérer la profondeur
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
        /* Initialisationd e glut et création  de la fenetre */
        glutInitWindowSize(720,720);
        glutInitWindowPosition(100,100);
        glutCreateWindow("OpenGL TP");
        /*Autre Initialisation */
        init();
        /*enregistrement des fonction rappel*/
        glutDisplayFunc(display);
        glutReshapeFunc(Reshape);
        glutKeyboardFunc(KeyPressed);

здесь я вызываю куб как анимацию

    glutIdleFunc(spawn);
    glEnable(GL_DEPTH_TEST);
    //light();
    /* entré dans mla boucle principal de glut*/
    glutMainLoop();

return 0;
}

1 Ответ

3 голосов
/ 05 января 2020

Чтобы сделать анимацию, вы должны постоянно обновлять дисплей. Удалите все вызовы на glutPostRedisplay и выполните один вызов в display. Например:

void display(){

    whatINeed();

    table();
    taupe();
    glutSwapBuffers();

    glutPostRedisplay(); // <---
}

Для анимации между двумя позициями необходимо знать предыдущую (pdx) и новую позицию (dx):

int pdx=0;
int dx=0;

Определить временной интервал для анимации. Используйте таймер (glutTimerFunc) вместо glutIdleFunc для запуска новой анимации:

int interval = 1000; // 1 second
void spawntimer(int value);
int main()
{
  // [...]

  // glutIdleFunc(spawn); <--- DELETE

  glutTimerFunc(interval, spawntimer, 0); // <--- ADD


  // [...]

В spawntimer сохраните текущий Положение на dx и получить случайную позицию. Сохранить текущее время до start_time. Указывает время начала анимации и может быть получено по glutGet(GLUT_ELAPSED_TIME). Перезапустите таймер:

int start_time = 0;
void spawntimer( int value )
{
    pdx = dx;
    dx = rand() % 3;
    start_time = glutGet(GLUT_ELAPSED_TIME);

    glutTimerFunc(interval, spawntimer, 0);
}

In taupe Рассчитайте относительное положение объекта в зависимости от времени в диапазоне [0,0, 1,0] и выполните интерполяцию между tabPos[pdx] и tabPos[dx]. Например:

void taupe(void){

    int current_time = glutGet( GLUT_ELAPSED_TIME );
    float dt = (float)(current_time - start_time) / interval;
    if (dt > 1.0f)
        dt = 1.0f;
    float interx = tabPos[pdx] * (1.0f - dt) + tabPos[dx] * dt;

    glPushMatrix();
    glTranslatef(interx,dy,tabPos[dz]);   // Ligne Milieu droite
    glColor3f(0.8,0.3,0.5);
    glutSolidCube(2);
    glPopMatrix();
}

...