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

Newton Discussion :

utilisation des matrices de Newton Games


Sujet :

Newton

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Points : 71
    Points
    71
    Par défaut utilisation des matrices de Newton Games
    Bonjour,

    Je voudrais utiliser NewtonBodyGetMatrix mais seulement j'ai aucune idée de leur fonctionnement... J'ai essayé de comprendre mais bon ---> plantage. Je ne comprends pas à quoi correspond quoi. Je ne suis qu'en première S donc je voudrais savoir où je pourrais de quoi comprendre les matrices (pas seulement la théorie mais également l'utilisation en géométrie) qui ne soit pas d'un niveau trop compliqué non plus (je n'ai aucune idée de la difficulté que ça peut représenter mais de ce que j'ai déjà vu, ça n'a pas l'air très compliqué en fait). Pour info, les matrices de Newton Games Dynamics ont une taille de 16 (4*4 il me semble).

    Merci d'avance

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut la body matrix te permet de faire essentiellement 3 transformations:

    translation, rotation (autour d'un axe), étirement dans le sens x,y ou z (ou symétrie) et d'enchainer ces transformations autant de fois que tu veux dans n'importe quel ordre

    si tu utilises opengl tu as du utilisé des matrices en faisant
    glRotatef, glTranslatef, glScalef
    (et aussi gluLookAt, gluPerspective mais c'est moins utile pour les body matrix de newton)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Points : 71
    Points
    71
    Par défaut
    En fait je voudrais surtout récupérer les coordonnées et l'angle pour d'autres calculs.

  4. #4
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    les coordonnées: 4 ième colonne de la matrice
    il y a probablement aussi une fonction pour récupérer la position avec newton
    l'angle: entre quoi et quoi ?

    le produit scalaire permet de trouver les angles en 3d (angle entre 2 vecteurs)

    à priori la direction droite de ton objet est dans la 1 ère colonne de la matrice,
    la direction haut de ton objet est dans la 2 ème colonne de la matrice,
    la direction derrière de ton objet est dans la 3 ème colonne de la matrice

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Points : 71
    Points
    71
    Par défaut
    J'utilise surtout la 2D, donc pour les coordonnées en 4ème colonne c'est dans l'ordre x,y,z (et le 4ème est inutile?)? Pour l'angle je veux parler de l'angle de l'objet, par rapport à l'axe des z (en 2D donc toujours) pour l'afficher entre autre car l'image que j'utilise pour cela est orientée "vers le haut" mais également pour calculer la direction de la force de l'objet (un tank qui avance vers la direction où il se tourne donc).

    Merci pour les 2 premières réponses! Par contre, je ne suis pas sûr de comprendre, l'axe z se trouve sur la 2ème ou 3ème colonne? Et comment est-il stocké (sin ou cos,...).

  6. #6
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    si tu utilises x et y et z est l'axe de rotation

    alors prends les 4 premières coordonnées de la matrice

    | a11 a12 . . |
    | a21 a22 . . |
    | . . . . |
    | . . . . |

    fabrique 2 vecteurs
    X = (a11,a21) --> 1ère colonne 2 coordonnées
    Y = (a12,a22) --> 2ème colonne 2 coordonnées

    la direction haut de ton perso est ce vecteur Y (en 2 dimensions)
    la direction droite de ton perso est ce vecteur X (en 2 dimensions)

    pour avoir l'angle de rotation tu peux faire atan2(a11,a21)
    atan2 est une fonction de math.h

    quelle librairie utilises tu pour l'affichage, opengl, SDL ?

    puisque tu es en 2d la position de l'objet (de son centre !) est le vecteur 2d (a14,a24)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Points : 71
    Points
    71
    Par défaut
    J'utilise OpenGL pour l'affichage (+ glut). Je n'ai plus qu'à tester le tout! Merci!

  8. #8
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut alors il suffit de multiplier la matrice modelview par la matrice de l'objet
    mais opengl est en column order et newton est en row order donc il faut utiliser la transposée de la matrice (échange ligne/colonne)

    void transpose(float trans[4][4], float mat[4][4]) {
    int i,j;
    for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
    trans[i][j] = mat[j][i];
    }
    }
    }
    et c'est tout tu multiplies modelview par la transposée de la matrice que as récupérée puis tu dessines ton objet
    float matrice[4][4], transposee[4][4];

    ....


    NewtonBodyGetMatrix( matrice, ...); //recuperer la matrice de l'objet
    transpose(transposee,matrice); // calculer la transposee
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glMultMatrixf(transposee);
    draw(); //dessin de l'objet
    glPopMatrix();

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Points : 71
    Points
    71
    Par défaut
    En fait je n'ai pas tout compris... Si je récupère la matrice dans un tableau de 16, elle se présente comme suis (par numéro "d'accès" au tableau)?

    0 4 8 12
    1 5 9 13
    2 6 10 14
    3 7 11 15

    L'utiliser avec OpenGL ne m'intéresse pas trop car je veux faire surtout une flèche (un canon en fait) dans la direction de la souris. De plus je n'ai pas compris pourquoi les coordonnées x et y sont représentées par 2 nombres. Dans un repère orthonormal, une valeur suffis non?

  10. #10
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    en gros ta matrice 4x4 représente un repère 3d plus une translation

    la première colonne (3 premières coordonnées) est un vecteur qui représente la direction droite
    la deuxième colonne (3 premières coordonnées) est un vecteur qui représente la direction haut
    la troisième colonne (3 premières coordonnées) est un vecteur qui représente la direction derrière
    la quatrième colonne (3 premières coordonnées) est un vecteur qui représente une translation (le centre du repère)

    dans le lien sur les matrices que je t'ai donné (sitetuzero.com) c'est expliqué !

    les matrices sont un moyen d'exprimer facilement un repère, une échelle dans ce repère, une translation, et par le même principe un enchainement de rotations scale translations (voir même projection mais c'est à mettre à part)

    exemple: si on a une matrice rotation 40° et une matrice rotation 55° (autour d'un même axe!) pour avoir une matrice rotation 95° il suffit de multiplier les 2 matrices

Discussions similaires

  1. Utilisation des matrices
    Par black_hole dans le forum OpenCV
    Réponses: 2
    Dernier message: 14/06/2011, 23h11
  2. systemC - utilisation des matrices
    Par Pascal.Oberle dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 06/07/2010, 14h01
  3. [Opengl] Utiliser des terrains + déformation in-game
    Par Froyok dans le forum Moteurs 3D
    Réponses: 4
    Dernier message: 20/04/2009, 08h36
  4. Débutant : utilisation des matrices en traitement d'image
    Par Black Templar dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 17/11/2008, 08h37
  5. [debutant]Utiliser des matrices en C
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 13/11/2005, 20h45

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