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 :

[c/c++]Rotation de Personnage


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [c/c++]Rotation de Personnage
    Salut à tous.

    Je suis actuellement en train de développer un "minecraft-like" pour un projet scolaire.

    J'ai donc fait le personnage (6 pavés), et je le fait déplacer dans l'espace.

    Le problème, c'est que mon personnage ne tourne toujours qu'autour du repère d'origine, au lieu de tourner autour de lui même.

    Voici le code que j'utilise pour générer le personnage :

    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
    37
    38
    39
    40
    41
    void dessinerPerso()
    {
        //BODY ###################################
        glRotated(angleBody,0,1,0);
        dessineCorps(DIM1,DIM1*1.5,DIM1/2);
     
     
        //HEAD ###################################
        glPushMatrix();
        glTranslated(0,DIM1,0);
        dessineTete(DIM1,DIM1,DIM1);
        glPopMatrix();
     
        //RIGHT ARM ###################################
        glPushMatrix();
        glTranslated(-DIM1/2,0,0);
        glRotated(angleRA,1,0,0);
        dessineBras(DIM1/2,DIM1*1.5,DIM1/2,1);
        glPopMatrix();
     
        //LEFT ARM ###################################
        glPushMatrix();
        glTranslated(DIM1,0,0);
        glRotated(angleLA,1,0,0);
        dessineBras(DIM1/2,DIM1*1.5,DIM1/2,0);
        glPopMatrix();
     
        //RIGHT LEG ###################################
        glPushMatrix();
        glTranslated(0,-1.5*DIM1,0);
        glRotated(angleRL,1,0,0);
        dessineJambe(DIM1/2,DIM1*1.5,DIM1/2,1);
        glPopMatrix();
     
        //LEFT LEG ###################################
        glPushMatrix();
        glTranslated(DIM1/2+1,-1.5*DIM1,0);
        glRotated(angleLL,1,0,0);
        dessineJambe(DIM1/2,DIM1*1.5,DIM1/2,0);
        glPopMatrix();
    }

    Je ne vous détaille pas les fonctions dessiner...(), elles génèrent juste un pavé avec la texture appropriée.

    Et voici ma fonction principale :
    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
    void Dessiner()
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity( );
     
        camera->look();
     
        dessinerRepere(200);
     
        //Génération de la Map
        glPushMatrix();
        glTranslated(-TAILLE_MAP/2,TAILLE_MAP,0);
        dessinePiece(TAILLE_MAP,TAILLE_MAP,TAILLE_MAP);
        glPopMatrix();
     
        //Déplacement du peronnage
        double x = axe * sin(angleBody * M_PI / 180.0);
        double z = axe * cos(angleBody * M_PI / 180.0);
        glTranslated(x,DIM1*3,z);
        //Génération du personnage
        dessinerPerso();
     
        glFlush();
        SDL_GL_SwapBuffers();
    }
    Si quelqu'un à une solution, je suis preneur

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    bonsoir

    le souci semble venir des la première ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glRotated(angleBody,0,1,0);
    dessineCorps(DIM1,DIM1*1.5,DIM1/2);
    J'imagine que tu doit avoir une translation de trop dessineCorps(); ... Ce n'est qu'une indication d'ou peut venir le souci. Il faut bien effectué la rotation après la translation.

    Maintenant, petit conseil : abandonnes les fonctions glRotated, glPopMatrix & Cie. Elle sont hyper hold school et noté en deprecated dans la documentation d'OpenGL, et indigeste pour les lecteurs qui veulent t'aider. Effectues quelque tutoriel sur les shaders, et ensuite tu fait le rendu avec tes propres matrices. C'est beaucoup plus fiable, rapide, moderne, intuitif que cette méthode ... Et avec des shaders, tu pourras surement avoir des rendus beaucoup plus convaincant. Le game play est serte original, mais les graphisme peuvent ne pas être pris comme référence / objectif.

    Cordialement.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    bonsoir

    LastSpear donne la bonne indication : il faut inverser les commandes de translations et de rotation.
    La règle est la suivante: les commandes doivent être émises dans l'ordre inverse par rapport à l'ordre selon lequel elles doivent prendre effet. Dans le cas ci présent, la commande de rotation doit être émise en utilisant les coordonnées de l'objet déjà translaté. C'est donc la translation qui vient en premier.

    les fonctions glRotated, glTranslated, glPopMatrix sont en effet dépréciée dans les nouvelles versions d'OPENGL... Ceci dit, OPENGL version 2.0 reste encore grand public et les nombreux tutoriels de qualités (type NEHE, nates Robin) utilisent ce type de fonction. Pour les débutants, ce type de fonctions sont donc incontournables.

    Pour ma part, je ferais 2 versions: dans un premier temps, avec les anciennes fonctions puis dans un second avec des shaders pour commencer à se familiariser avec les nouveautés (et aussi enrichir le nombre d'exemples dans le monde OPENGL MODERNE). Ceci ne reste bien sur qu'un avis personnel

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut à tous, merci pour vos réponses.

    Le problème étant que je doit utiliser des glRotated et glTranslated.

    J'ai déjà inversé le glTranslated et la glRotated, ça ne change rien au problème.

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    bonjour

    c'est vraiment bizzare
    j'ai repris ton code et j'ai fais un projet exemple. J'ai pas tout dessiner: juste une sphère pour la tête et un parallépipède pour le corps
    quand j'incrèment axe, l'objet se déplace bien (selon l'axe des x pour moi) et quand j'incrèmente ou décrémente angleBody, mon personnage tourne bien autour de lui même!!!!

    Sinon, je te propose de faire autrement et plus simple (de mon point de vue)
    tu défini 3 coordonnées pour ton personnage pour le translater dans l'espace:
    xp=0
    yp=0
    zp=0
    tu maintiens angleBody pour le faire tourner et maintenant, pour le déplacer tu fais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glTranslated(xp,yp,zp);
    glRotated(angleBody, 0, 1 ,0);
    dessinerPerso();
    de cette manière, quelque soit la position du personnage, il tourne autour de lui même

    par ailleurs, cela t'évite les calculs fastidieux avec les cos et sin
    dis moi si ca marche mieux ainsi

  6. #6
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Citation Envoyé par toniovip Voir le message
    Salut à tous, merci pour vos réponses.

    Le problème étant que je doit utiliser des glRotated et glTranslated.

    J'ai déjà inversé le glTranslated et la glRotated, ça ne change rien au problème.
    Rotation autour d'un axe : translate (pour amener l'axe en zero), rotate, translate (pour amener l'axe où il était avant le premier translate).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #7
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Pour un objet simple (non articulé), les sommets sont peut-être déjà exprimés dans un repère où l'axe de rotation passe par zéro, dans ce cas tu peux éviter le premier translate. Mais bon si tu as un objet articulé et que les parties articulées sont dans un repère commun, alors il n'y a probablement pas d'axe commun d'où besoin de faire d'abord la translation puis la rotation puis la translation à nouveau. (et le refaire pour déplacer l'objet articulé dans le repère du monde, puis dans le repère de l'oeil/caméra.)

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

Discussions similaires

  1. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 17h38
  2. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 16h11
  3. Rotation d'un bouton ?
    Par ken_survivant dans le forum Composants
    Réponses: 3
    Dernier message: 01/04/2003, 19h16
  4. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 18h59
  5. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 23h58

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