3 pièce(s) jointe(s)
[OpenGL] La caméra tremble
Bonsoir à tous, je me permets de vous faire part d'un problème qui ne m'était jamais apparu auparavant : La caméra tremble.
Je code un petit jeu en OpenGL où l'on conduit un TGV, j'utilise l'axe des Z comme axe vertical et le train est initialement orienté dans la direction de X, ainsi que la caméra. Lorsque l'on active la vue en cabine, le calcul de la position de la caméra connaissant celle du train ainsi que l'orientation de ce dernier se fait de cette façon :
A = xTrain + 7 * cos(angleTrain)
B = yTrain + 7 * sin(angleTrain)
xCam = A - 0.5*sin(angleTrain)
yCam = B + 0.5*cos(angleTrain)
Voici un schéma explicatif :
Pièce jointe 199559
Pour calculer la position de la cible de la caméra, je prends comme distance 900 (Par exemple) et je procède ainsi :
xCible = xCam + 900 * cos(angleCam + angleTrain)
yCible = yCam + 900 * sin(angleCam + angleTrain)
Un autre schéma pour expliquer :
Pièce jointe 199561
Lorsque je teste, je me rends compte que la caméra tremble dès que la somme (angleCam + angleTrain) a une valeur différente de 0, 90, 180 ou 270° ! J'ai toujours géré la caméra de cette façon et je n'ai jamais eu ce problème.
Voici le code résumé du main:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| int main(int argc,char *argv[])
{
SDL_Surface *ecran;
SDL_Event evenement;
if(SDL_Init(SDL_INIT_VIDEO)!=0) //Initialisation mode vidéo SDL
return -1;
SDL_WM_SetCaption("TGV Driving",NULL);
putenv("SDL_VIDEO_CENTERED=1");
ecran=SDL_SetVideoMode(800,600,32,SDL_OPENGL); //Fenêtre SDL
glMatrixMode(GL_PROJECTION); //Appel matrice de projection
glLoadIdentity();
gluPerspective(70,4.0/3,0.1,1000);
glEnable(GL_TEXTURE_2D); //Initialisations texturing et Z-buffer
glEnable(GL_DEPTH_TEST);
//Chargement textures et initialisations paramètres
while(1) //BOUCLE PRINCIPALE
{
SDL_PollEvent(&evenement);
if(evenement.type==SDL_QUIT)
break;
if(evenement.type==SDL_KEYDOWN)
{
...
}
CommandeTrain(&infos); //Mouvement du train
gestionCam(&infos,evenementCam); //Gestion de la caméra
Dessiner(&infos); //Dessin 3D
glFlush();
SDL_GL_SwapBuffers();
}
SDL_Quit();
return 0;
} |
Et celui de la fonction gestionCam() :
Code:
1 2 3 4 5 6 7 8 9 10 11
| void gestionCam(Principale *ptr)
{
ptr->vuesCam[1].xRepere1=ptr->convoi[ptr->numTrain].voitures[0].x+7*cos(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); //Calcul A et B
ptr->vuesCam[1].yRepere1=ptr->convoi[ptr->numTrain].voitures[0].y+7*sin(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180);
ptr->vuesCam[1].x=ptr->vuesCam[1].xRepere1-0.5*sin(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180); //Calcul xCam et yCam
ptr->vuesCam[1].y=ptr->vuesCam[1].yRepere1+0.5*cos(ptr->convoi[ptr->numTrain].voitures[0].angle*M_PI/180);
ptr->vuesCam[1].xCible=ptr->vuesCam[1].x+900*cos((ptr->convoi[ptr->numTrain].voitures[0].angle+ptr->vuesCam[1].angle)*M_PI/180); //Calcul xCible et yCible
ptr->vuesCam[1].yCible=ptr->vuesCam[1].y+900*sin((ptr->convoi[ptr->numTrain].voitures[0].angle+ptr->vuesCam[1].angle)*M_PI/180);
} |
ptr est un pointeur sur une structure contenant les différents paramètres, vuesCam[] est un tableau de structures qui contiennent les coordonnées de A et B (xRepere1 et yRepere1) ainsi que celles de la caméra (x et y) et celles de la cible de la caméra (xCible et yCible), ainsi que l'orientation de la caméra par rapport au train (angle). convoi[] est un tableau de structures représentant les différents trains, chaque case de ce tableau contient un tableau de structures appelé voitures[] (La motrice et les wagons) contenant entre autres l'orientation de la voiture de train).
Je n'arrive pas au bout de ce problème, j'y ai passé tout l'après-midi, auriez-vous une solution svp ??