2015-10-07 1 views
0

Je voudrais utiliser glutTimerFunc pour déplacer la caméra autour de la scène composée de quelques maillages. Le chemin de la caméra est construit avec une courbe de Bézier comme ce qui suit:OpenGL/Glut: glutTimerFunc ne semble pas démarrer

if(sel == MODE_CAMERA_MOTION) { 
    mode = MODE_CAMERA_MOTION; 
    stepsCounter = 0; 
    // Building camera track 

    int i, j, k; 

    for(j=0; j<MAX_CV; j++) { 
     tmpCV[j][0] = CV[j][0]; 
     tmpCV[j][1] = CV[j][1]; 
     tmpCV[j][2] = CV[j][2]; 
    } 

    for(i=0; i<STEPS; i++) { 

     for(j=1; j<MAX_CV; j++) { 
      for(k=0; k<MAX_CV-j; k++) { 
       lerp(i/(float)(STEPS*10), tmpCV[k], tmpCV[k+1], tmpCV[k]); 
      } 
     } 

     cameraPosition[i][0] = tmpCV[0][0]; 
     cameraPosition[i][1] = tmpCV[0][1]; 
     cameraPosition[i][2] = tmpCV[0][2]; 

    } 

    glutTimerFunc(250, moveCamera, STEPS); 
} 

où la fonction est MoveCamera:

void moveCamera() { 
    if (mode == MODE_CAMERA_MOTION) { 

    camE[0] = cameraPosition[stepsCounter][0]; 
    camE[1] = cameraPosition[stepsCounter][1]; 
    camE[2] = cameraPosition[stepsCounter][2]; 

    if(stepsCounter < STEPS) { 
     stepsCounter++; 
    } 

    else { 
     /* come back to the first point */ 
     camE[0] = 8.8; 
     camE[1] = 4.9; 
     camE[2] = 9.0; 
     stepsCounter = 0; 
    } 

    glutPostRedisplay(); 

    } 
} 

Mais rien ne bouge. Peut-être ai-je mal compris le comportement de cette fonction. Où est-ce que je me trompe?

+1

Utilisez-vous camE quelque part? Avez-vous vérifié si la fonction est appelée ou non? – BDL

Répondre

1

Le prototype de la fonction passée à glutTimerFunc devrait être

void (*func)(int value) 

Lorsque le dernier paramètre de glutTimerFunc est la valeur passée. Donc, votre moveCamera devrait être:

void moveCamera(int STEPS) 

De même, la fonction moveCamera sera appelée une seule fois. Vous devez vous réenregistrer à la fin de l'exécution. Cela pourrait être une solution possible:

// instead of global STEPS and stepsCounter, we decrement at reexecution 
void moveCamera(int STEPS) { 
    ... do stuff 
    glutTimerFunc(250, moveCamera, STEPS-1); 
}