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

DirectX Discussion :

Faire bouger un personnage


Sujet :

DirectX

  1. #1
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut Faire bouger un personnage
    Voilà c'est les bases mais ca n'en est pas plus évident :

    J'ais un personnage qui s'affiche très bien à l'écran, je récupère les données INPUT du clavier et je le fais bouger... mais si je fais une rotation, et que je le fais avancer en Z par exemple, mon perso va faire une sorte de moonwalk hideux.

    Il me faudrait, à chaque rotation de mon personnage, changer une valeure qui affecterait son mouvement mais comment faire ????

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Bonjour,
    j'avais posé déjà cette question , Loulou24 m'a répondu en utilisant par exemple une librairie additionnelle.
    http://www.developpez.net/forums/vie...ght=personnage

    Sinon la solution c'est de charger à chaque mouvement une "mesh" au format .X différent.
    La posture du personnage sera articulée avec un logiciel de 3d...

  3. #3
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Merci pour ces liens... Ca va m'être utile

    Mais ma question ne parlait pas d'animations... juste du mouvement... c'était une question ( à mon avis ) beaucoup plus stupide :

    Si tu fais bouger un tigre par exemple ( tiger.x ) sur l'axe des Z, il va avancer la tête en avant, les talons derrières mais si tu le fait tourner sur l'axe des Y, et que après tu le fais a nouveaux avancer sur l'axe des Z, il va avancer de côté ... car l'axe n'a pas été changé avec la rotation...
    La réponse doit être facile mais j'avoue que la méthode que je pensais utiliser prend pleins de vecteurs et je la trouve assez compliquée pour un problème qui paraît si simple...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Eh bien oui, la solution est simple, il ne faut pas le faire avancer selon l'axe Z 8).

    Plus sérieusement, l'axe selon lequel tu veux le faire avancer ce n'est pas exactement Z, c'est Z dans le repère local de l'objet, c'est-à-dire après avoir appliqué ta rotation. Ne pas confondre le repère global et les repères locaux.

    Concrètement, il ne faut pas appliquer ta (matrice de) translation directement, il faut la multiplier avec la rotation précédente.

  5. #5
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    D'accord j'avais déjà essayé ca et en effet il avancait bien mais la rotation devenait une rotation autour du point (0,0,0) !
    C'est normal ???
    voilà comment je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    D3DXMatrixRotationYawPitchRoll(m_matWorld)
    D3DXMatrixScaling(matMult)
    D3DXMatrixMultiply(m_matWorld,m_matWorld,matMult)
    m_matWorld._41 = Pos.x
    m_matWorld._42 = Pos.y
    m_matWorld._43 = Pos.z
    Comment ferais tu pour faire ces trois opérations avec ta manière de multiplier les matrices ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La rotation autour de l'origine est normale, c'est pour cela qu'il faut toujours effectuer les translations en dernier.

    MatTransfo = MatRotation * MatScaling * MatTranslation

  7. #7
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Là je dois avouer que je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	D3DXMATRIX matRotation;
    	D3DXMATRIX matScaling;
    	D3DXMATRIX matTranslation;
    	D3DXMatrixIdentity(&m_matWorld);
    	D3DXMatrixIdentity(&matRotation);
    	D3DXMatrixIdentity(&matScaling);
    	D3DXMatrixIdentity(&matTranslation);
    	D3DXMatrixRotationYawPitchRoll(&matRotation, m_vRotation.y, m_vRotation.x, m_vRotation.z);
    	D3DXMatrixScaling(&matScaling, m_vScale.x, m_vScale.y, m_vScale.z);		
    	D3DXMatrixTranslation(&matTranslation, m_vPos.x, m_vPos.y, m_vPos.z);
    	m_matWorld = matRotation * matScaling * matTranslation;
    Me refais des coordonnées dans le repère global...

    Si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_matWorld = matTranslation * matScaling * matRotation ;
    Il me refait des rotation sur l'origine...

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'ai du mal à voir ce qui cloche encore par rapport à ce que tu veux faire. Une explication détaillée ? Un screen ? Un ptit dessin ?

  9. #9
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Je vais essayer d'expliquer simplement ce que je voudrais faire:

    Je voudrais reconstituer une troisième personne de RPG, avec la camera en hauteur et derrière le joueur, le joueur qui pivote sur lui même et non sur l'origine et quand on augmente sa coordonée Z, je voudrais que le joueur avance en ligne droite...

    Ps: la camera n'est pas ma priorité, c'est juste pour essayer d'expliquer un peu mieux...

    PS2: ce qui cloche c'est que soit il n'avance pas en ligne droite et tourne sur lui même(1er exemple de mon dernier post), soit il avance en ligne droite et tourne autour de lorigine ( 2nd exemple de mon dernier post)

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il n'avance pas en ligne droite ? C'est-à-dire ?

  11. #11
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    C'est le problème du début, la rotation n'est pas prise en compte, et après l'avoir tourné, il avance de coté ( la tête pas en avant )

  12. #12
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par DeusXL
    Si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_matWorld = matTranslation * matScaling * matRotation ;
    Il me refait des rotation sur l'origine...
    c'est normal, il faut inverser l'ordre des matrice, c'est a cause des compositions de fonction...

    en gros si tu veut faire d'abord une rotation puis apres une translation, dans la pratique il faudra commencer par la translation puis apres la la rotation...

    si tu a matTrans la matrice de translation et matRot la matrice de roatation

    le resultat sera
    final = matTrans(matRot(vecteur))
    ou
    final = matTrans ° matRot
    ou encore
    final = matTrans * matRot

    enfin j'espere que je n'ai pas fait d'erreure dans mon explication.

    sur http://www.javamus.fr.st/ il y a un tres bon cours sur le matrice ou tout cela est expliqué plus clairement (et plus surement) que ce que je vieny d'expliquer.

  13. #13
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    que signifie le signe
    ° ?

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    (f o g)(x) = f ( g (x) )

    pour ce que tu veux faire, soit tu as du temps et tu te renseignes sur tout ce qui est quaternion (-> google): c'est vraiment très puissant.
    Soit tu fais ça plus simplement avec les fonctions trigo...

  15. #15
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Soit je suis poursuivis par la malchance, soit je me trompe quelquepart mais j'ais essayé d'utiliser les quaternions...
    Ca élimine le gimbal lock mais pas mon problème de matrice...
    Je résume:
    Soit je fait une rotation puis une translation ( mat Trans * matRot)
    et là mon personnage avance la ltete devant mais tourne autour de lorigine

    Soit je fait une Translaion puis une rotation ( matRot* mat Trans)
    et là mon personnage fait l'inverse...

    Moi je voudrais un mélange des deux et j'ais beau lire et relire, essayer et reessayer, je me retrouve face au même problème...

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    Je n'ai vraiment pas bcp d'expérience dans le domaine, mais j'y ai été confronté au début de l'année pour mon projet epita(en OpenGL, mais c'est le même principe je pense)

    problème: lorsque tu "tournes", ton objet pivote visuellement, mais sa direction réelle reste la même

    en fait, ton objet commence par subir une fois une transfo par rapport à l'origine (son placement dans l'espace), puis les transfo sur lui-même.

    lorsque tu fais pivoter ton objet, il se passe encore la même chose, comme à chaque tour de boucle: tu es placé dans l'espace, puis tu pivotes. or, c'est à ce moment qu'un axe "local" est attribué à ton objet. et c'est là qu'est ton problème. une fois ton objet initialisé dans l'espace (à sa place, orienté ds le bon sens...), si tu veux le faire repivoter, il faut d'abord multiplier par l'inverse de la matrice qui t'a servi à le placer dans l'espace (translation je pense), ensuite tu prends le cycle normal: pivote comme tu veux, et replace.

    donc à chaque fois tu dois garder la matrice qui t'as permi le placement dans l'espace, et calculer son inverse.

    je suis pas sûr d'avoir été bien clair, et c'est possible que j'ai dit des conneries, mais il me semble bien que ça se passe comme ça....

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    et je ne sais pas si le gimbal lock c'est ça, mais en tout cas les quaternions permettent d'éviter justement cette tranfo inverse, et donc l'inversion de la matrice et je pense que ça peut faire gagner pas mal en performance sur des projets d'un certain niveau...

    toujours sous réserve que mes sources de documentation soit valide, et surtout que je les ai bien compris...

  18. #18
    Membre actif Avatar de DeusXL
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 300
    Points : 272
    Points
    272
    Par défaut
    Je crois que le gimbal lock est l'accumulation de rotation qui font que la rotation devient déformée ( les joueurs se sont abitués et moi quand je le vois ca ne me fait rien ou presque ).

    PS: pourrais tu me montrer ce que tu m'explique avec des calcul car j'ais du mal à m'imaginer ce qu'il faut faire ( matFinal pour la matrice finale, oldmatTranslation pour l'ancienne matrice de translation... )

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le gimbal lock c'est quand à force de tourner t'as 2 axes qui viennent se superposer. Et donc après les rotations ne collent plus.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 58
    Points : 48
    Points
    48
    Par défaut
    Ok pour le gimbl lock

    sinon pour ce que je t'expliquais, en opengl ça donnerait à peu près ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glPushMatrix()         // on sauvegarde la matrice
       glLoadIdentity()    // on réinitialise tout -> on se retrouve en (0, 0, 0)
       glRotatef()         // on effectue la rotation
       glTranslated()      // puis le placement dans l'espace
       DrawObject()        // on dessine
    glPopMatrix            // on récupère la matrice dans l'état avant transfo
    sauf que je ne me souviens jamais de l'ordre translation/rotation...

    et ici, c'est le couple glPushMatrix/glPopMatrix qui joue le rôle d'inversion de matrice, par rapport à ce que je t'expliquais plus haut. il fait pareil avec la matrice de rotation, donc si tu veux faire pivoter ton objet de 10°, alors que tu l'as fais pivoter de 20° juste avant, il faudra que tu entre un angle de 30°. c'est comme si tu repartais toujours de (0, 0, 0), et du sens initial.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/06/2008, 12h07
  2. faire bouger un personnage
    Par youp_db dans le forum SDL
    Réponses: 4
    Dernier message: 31/07/2006, 19h43
  3. Réponses: 10
    Dernier message: 06/05/2005, 20h02
  4. [FLASH MX2004] Faire bouger un clip
    Par Ticoche dans le forum Flash
    Réponses: 2
    Dernier message: 21/11/2004, 11h17

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