IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

calculs mathematiques : rotation camera


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut calculs mathematiques : rotation camera
    Salut à tous,

    J'ai un soucis actuellement avec mon petit projet.
    Grosso modo, j'affiche ce que je veux sans probleme, tout fonctionne tranquillou et tout le tintouin sauf un truc : la rotation de la camera.
    Pour ce faire j'ai créé une classe camera comme j'ai pu le voir dans divers tutos.

    Voici le code :

    Classe camera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include "camera.h"
     
    camera::camera(float iposx,float iposy,float iposz,float iviewx,float iviewy,float iviewz)
    		{
    		posx = iposx;
    		posy = iposy;
    		posz = iposz;
     
    		viewx = iviewx;
    		viewy = iviewy;
    		viewz = iviewz;
    		}
     
    void camera::init(void)	
    	{
    	gluLookAt(  posx, posy, posz,
    				viewx, viewy, viewz,
    				0.0, 1.0, 0.0); 
    	}
     
    void camera::rotateX(int angle2)
    	{
    	float angle = angle2/180.f*(float)PI;
    	float viewy2=viewy;
    	viewy = cosf(angle)*(viewy-posx)+sinf(angle)*(posy-viewz)+posx;
    	viewz = cosf(angle)*(viewz-posy)+sinf(angle)*(viewy2-posx)+posy;
    	}
     
    void camera::rotateY(int angle2)
    	{
    	float angle = angle2/180.f*(float)PI;
    	float viewx2=viewx;
    	viewx = cosf(angle)*(viewx-posx)+sinf(angle)*(posy-viewz)+posx;
    	viewz = cosf(angle)*(viewz-posy)+sinf(angle)*(viewx2-posx)+posy;
    	}
    Pour m'en servir, je fais comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    void mouse(int button, int state,int x,int y)
    	{
    	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
    		{
    		presse = 1;
    		xold = x; 
    		yold = y;
    		}
    	if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) 
    		presse=0;
    	}
     
    void mousemotion(int x,int y)
    	{
        if (presse) 
    		{
    		int r,r2;
     
    		r=x-xold;
    		if (r>=360)
    			r-=360;
    		cam.rotateY(r); 
     
    		r2=y-yold;
    		if (r2>=360)
    			r2-=360;
    		cam.rotateX(r2); 
     
    		glutPostRedisplay(); 
    		}
    	xold = x;
        yold = y;
    	}

    Mousemotion et mouse sont les fonctions de glut qui gerent la souris.
    Mon probleme est le suivant :

    Lorsque je fais soit l'une ou l'autre des rotations (selon X ou selon Y) j'ai une sorte de truc bizarre qui se passe.
    Par exemple, si je fais une rotation selon X, il ne devrait y avoir de mouvement que sur les coordonnées z et y. Eh bien là, il y a aussi x qui bouge car au lieu de monter ou descendre elle fait bien ce que je veux mais avec un léger mouvement circulaire en fait...enfin comment expliquer...

    au lieu que le mouvement decrive une droite il decrit une sort de rond. et ça se produit surtout vers certaines zones de l'ecran.... bizarre bizarre... vu que la gestion au niveau souris renvoie des rotations d'angles tres faibles (1°)....

    Voilou grosso modo mon soucis. Alors je ne suis pas vraiment certain de la formule de rotation et je voulais savoir si quelqu'un pouvait y jetter un oeil svp ? merci d'avance
    @+

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Je pense que c'est ton upvector qui pose probleme, lorsque tu franchit certaines "limites" de rotation, le upvector provoque un retournement ou un basculement de la caméra...
    Malheureusement, je peux pas vraiment t'aider, car en ce qui me concerne, mes caméra sont gérer avec des matrices de transformations et je ne comprends pas super bien le calcul sur les vecteur de ton code (je suppose que c'est une rotation de vecteur mais vu l'heure...)

    perso, chez moi ca marche comme ca (en résumé) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    eyeDir.x = worldMatrix[8] - worldMatrix[12];
    eyeDir.y = worldMatrix[9] - worldMatrix[13];
    eyeDir.z = worldMatrix[10] - worldMatrix[14];
     
    // eyeCenter == eyeDir
     
    gluLookAt(camera->worldMatrix[12], //eye X
    	camera->worldMatrix[13], //eye Y
    	camera->worldMatrix[14], //eye Z
    	eyeCenter.x, //center X
    	eyeCenter.y, //center Y
    	eyeCenter.z, //center Z
    	0.0f, // upvect X
    	sin(camera->worldMatrix[5]), // upvect Y
    	0.0f); // upvect Z
    les matrices 12 13 14 correspondes aux translations world x y z, et 8 9 10 sont en fait les composant du vecteur de rotation Z de la matrice... note le sin(camera->worldMatrix[5]), ça c'est pour prévenir que la caméra parte en vrille (ca marchait la derniere fois que j'ai testé)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut,

    J'ai changé de méthode, je suis passé directement par des solution de rotation/translation de matrice globale avec un gltranslatef et glrotatef.

    Par contre j'ai longuement hésité à le faire... je ne sais pas si c'est une bonne méthode de faire ça ou tout du moins si c'est la méthode la plus utilisée en opengl quoi... à ton avis ?

    Merci quand meme pour ton code ^^

    ++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Je ne sais pas vraiment ce qui est conseillé ou généralement utilisé, par contre en ce qui me concerne gltranslate et glrotate se sont tres vite révelé casse couille et insufisants pour ce que je voulais faire... j'ai donc fait des moulinettes perso pour construires les matrices...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Beh ecoutes, apparement pour la gestion d'un deplacement à la FPS, c'est ultra simple, tu incremente decremente tes angles ou positions via les entrées clavier ou souris et ensuite dans la displayfunc juste apres avoir chargé la matrice identité, tu fais juste tes deux rotates et ton translate et hop tu as ton deplacement ^^ (enfin je dis ca, mais bon, je pense que tu dois avoir de bonnes raisons pour ne pas l'utiliser ^^)

    Par contre y'a un truc qui me chiffone là... truc vraiment trop zarbi...
    Logiquement, apres deux rotates (sur y et x) ton repere de ta matrice sur laquelle tu bosses à changé en fonction des deux rotates non ?

    Car là, je viens de faire un test et voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    glLoadIdentity();
     
    	glRotatef(rquadx,1.0,0.0,0.0);
    	glRotatef(rquady,0.0,1.0,0.0);
    /*	gluLookAt(  5.0, 7.0, 0.0,
    				0.0, 2.0, -0.0,
    				0.0, 1.0, 0.0);*/
    	if (bufferClavier[0])
    		posz++;
    	if (bufferClavier[1])
    		posz--;
    	if (bufferClavier[2])
    		posx--;
    	if (bufferClavier[3])
    		posx++;
    	glTranslatef(posx,posy,posz);
     
    glPushMatrix();
    	glBegin(GL_LINES);
    Donc en gros c'est le debut de ma fonction displayfunc (manque deux trois lignes au dessus et manque le reste du dessous mais on s'en cogne.

    Donc en haut, je commence avec rien, je fais mes deux rotations pour la vue (gérée par la souris) puis j'incrémente mes positions et je fais un translate.

    Beh le soucis c'est que le translate se fait selon le repere du départ et non sur le repere modifié par les rotates....
    C'est normal ???

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par zax-tfh
    Beh ecoutes, apparement pour la gestion d'un deplacement à la FPS, c'est ultra simple, tu incremente decremente tes angles ou positions via les entrées clavier ou souris et ensuite dans la displayfunc juste apres avoir chargé la matrice identité, tu fais juste tes deux rotates et ton translate et hop tu as ton deplacement ^^ (enfin je dis ca, mais bon, je pense que tu dois avoir de bonnes raisons pour ne pas l'utiliser ^^)
    Oui, les hierarchies... pour calculer la transformation de tes objets en suivant les hierarchies, t'es obligé de post multiplier les matrices... ca se révele vite chiant avec les 4 fonctions de base d'opengl...

    Citation Envoyé par zax-tfh
    Donc en haut, je commence avec rien, je fais mes deux rotations pour la vue (gérée par la souris) puis j'incrémente mes positions et je fais un translate.

    Beh le soucis c'est que le translate se fait selon le repere du départ et non sur le repere modifié par les rotates....
    C'est normal ???
    Ben, en théorie non...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Euhhh question toute bete, y'aurait pas une option d'initialisation qui ferait un truc du genre : quand tu fais une transo, elle ne s'applique qu'à l'objet suivant et basta, elle ne modifie pas la matrice "générale" ?

    Car la je viens de faire un test effarant...

    Dans moin displayfunc voila ce que je fais grosso modo :

    je fais mes rotate et translate du point de vue
    j'affiche un quadrillage de GL_LINES pour faire un pseudo sol
    j'affiche 3 lignes pour former mon repere
    j'affiche un objet 3dsmax avec une rotation de 90° sur un axe

    Au depart, nickel, tout baigne
    si je bouge ou je tourne le point de vue, tout reste à sa place ! et tout ça sans aucun pushmatrix !!!!!!!! y'a une cou*** dans le paté là !
    J'ai testé un code source choppé sur un site ou ils ont fait un pseudo monde virtuel tout simple, et pourtant dans leur code à eux ca fonctionne bien. Il doit donc y avoir un truc dans mon code qui fait que, mais je ne vois pas quoi

    Any idea ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Je ne sais pas, je ne me suis pas assez intéréssé à ces fonctions... regarde si tu n'a pas un glLoadIdentity() quelque part en trop

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Je pense que je vais ouvrir un topic pour ça, ce sera mieux, car plus trop grand chose à voir avec le reste. Mais avant ça va falloir que je fasse des essais

    Merci quand meme.
    @++

Discussions similaires

  1. effectuer calculs mathematiques avec des données sql
    Par manutergnier dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/05/2008, 11h38
  2. Orientation et Rotation camera 3D
    Par pkpas dans le forum Moteurs 3D
    Réponses: 9
    Dernier message: 01/08/2007, 00h02
  3. rotation camera glutlookat
    Par hysah dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/04/2006, 12h07
  4. Calcul mathématiques avec Linux.
    Par JavaAcro dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/02/2006, 22h35
  5. calcul de rotation de coordonées
    Par ahoyeau dans le forum OpenGL
    Réponses: 10
    Dernier message: 05/03/2004, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo