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

Moteurs 3D Discussion :

changement de repere


Sujet :

Moteurs 3D

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 79
    Points
    79
    Par défaut changement de repere
    bonjour,
    j'essaie d'effectuer un changement de repère. Je travaille sous Java3D. J'ai tenté avec des matrices des changements de repère moi même, mais je n'obtiens pas la bonne transformation.
    J'ai tenté par une méthode un peu plus bourrine, mais j'ai un soucis de compression sur un axe et ca rend assez moche.
    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
    Vector3f da, db, dc;
           float x,y,z;
           Point3f temp;
           da = new Vector3f();
           db = new Vector3f();
           dc = new Vector3f();
     
           da.cross(V, W);
           db.cross(W, U);
           dc.cross(Y, V);
     
           for(int i = 0; i< tab3D.S3D.length; i++)
               for(int j = 0; j< tab3D.S3D[0].length; j++)
           {
               temp =  tab3D.S3D[i][j].p3D;
               x = (temp.x - E.x);
               y = (temp.y - E.y);
               z = (temp.z - E.z);
               temp.x = ( ( x*da.x + y*da.y + z*da.z ) / (U.x*da.x + U.y*da.y + U.z*da.z) );
               temp.y = ( ( x*db.x + y*db.y + z*db.z ) / (V.x*db.x + V.y*db.y + V.z*db.z) );
               temp.z = ( ( x*dc.x + y*dc.y + z*dc.z ) / (W.x*dc.x + W.y*dc.y + W.z*dc.z) );
     
           }
    est ce que quelqu'un saurait où ma fonction est fausse? Ou mieux, quelqu'un pourrait il m'indiquer où est ce que je peux trouver une fonction de changement de repère?

    Merci

  2. #2
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Que cherches-tu à faire comme transformation? A priori tu travailles avec des vecteurs à 3 coordonnées, tu veux faire des rotations?

    Dans ton code, tu ne dis pas ce que sont U, V, W, Y...


  3. #3
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Ce que je cherche à faire, c'est un changement de repère.
    En gros, j'ai des points définis dans le repère monde, mais je voudrais les convertir en fonction d'un nouveau referentiel.

    X,Y,Z correspondent aux vecteurs de mon premier repère.
    U,V,W correspondent aux vecteurs de mon second repère.
    (je me suis trompé en recopiant , le dernier produit vectoriel c'est U,V et non pas Y,V).

    Donc pour faire simple, je voudrai exprimer les coordonnées d'un objet dans un nouveau repère dont je connais le centre et les vecteurs unitaires.
    Merci.

  4. #4
    Invité
    Invité(e)
    Par défaut Changement de repère ou transformation
    Bonjour,
    Je n'ai pas non plus très bien compris le but.
    Le changement de repère le plus simple, et ce qu'on entend généralement par changement de repère est une translation.
    X = x + TX;
    Y = y + TY;
    Z = z + TZ;
    On peut aussi vouloir faire une homothétie, ce sera de la forme
    X = x * kX + TX;
    ou une rotation
    X = x * rX + y * rY + z * rZ + TX;
    où les termes rX, rY, rZ sont les paramètres de l'affinité, la rotation+homothétie en est un cas particulier.

    Lorsqu'on fait une transformation sur une figure, un vecteur, un triangle ou un objet plus compliqué, on transforme chaque point, et non des vecteurs.

    Si la question est "soit un repère E1 défini par les vecteurs unitaires X, Y, Z et un repère E2 défini par les vecteurs unitaires U, V, W comment transformer une figure F connue dans le repère E1, en une figure G dans le repère E2", alors il faut commencer par calculer les paramètres de la transformation, une affinité dans le cas général, et appliquer la formule à tous les points de F pour obtenir la figure G.

    Je connais bien cette transformation en 2D, il y a 6 paramètres.
    En 3D, je ne suis pas tout à fait sûr de moi, je pense qu'il y a 12 paramètres.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Ton repere R2 est définie dans ton repère R1 par une matrice M (la matrice de passage de R2 vers R1)

    Pour passer du repère R1 au repère R2, il faut multiplier par la matrice de passage de R1 vers R2 soit l'inverse de M tout simplement.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  6. #6
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 79
    Points
    79
    Par défaut
    je suis entièrement d'accord avec toi fifron.
    Le HIC, c'est que j'ai toujours appris que pour construire cette matrice, il faut les 3 vecteurs unitaires de R2 exprimés dans R1 et le centre de R2 exprimé dans R1.

    Soit R1 (O,X,Y,Z)
    et R2(E,U,V,W)

    avec E(Ex,Ey,Ez) Exprimés dans R1
    et U(Ux,Uy,Uz), V(Vx,Vy,Vz) et W(Wx,Wy,Wz) exprimés dans R1.

    La matrice de passage donne donc
    Ux Vx Wx Ex
    Uy Vy Wy Ey
    Uz Vz Wz Ez
    .0. .0. .0. 1

    mais sur certains exemple ça ne marche pas (en tous cas pas sur ce que j'ai pris pour faire mes tests et ils sont relativement simple).

    peut être que je me suis trompé de formule, mais je n'en trouve pas d'autre.

  7. #7
    Invité
    Invité(e)
    Par défaut Changement de base
    Question,
    On travaille en 3D ou en 2.5D?
    Si c'est en 3D, pourquoi le troisième vecteur unitaire de R2 est Z et non pas W.
    Si c'est en 2.5D, alors là on se complique la vie inutilement.
    Je pose la question autrement, si les éléments étudiés ont un rapport avec une représentation sur le terrain, où la verticale, c'est à dire la direction de la gravité est unique, alors, il faut faire le changement de base en 2D et éventuellement la coordonnée Z aura à subir une translation (une simple addition)
    Si il s'agit de la seconde hypothèse, c'est une opération courante.
    Cordialement.

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 79
    Points
    79
    Par défaut
    Mille excuses... c'est bien en 3D "véritable", je me suis juste trompé en écrivant (ca devient une habitude ^^)

    merci pour cette remarque.

  9. #9
    Invité
    Invité(e)
    Par défaut Précision
    Bon, alors il faut établir la formule.
    Un autre point m'est venu à l'esprit entre temps, si les coordonnées résultantes comportent beaucoup de chiffres, il me parait indispensable que le résultat soit de la forme P = T + f(...), sinon, il y aura forcément des problèmes de précision. Les relations résultant de calculs matriciel tels qu'ils sont écrits dans le programme font perdre la précision.
    La solution consiste peut-être à définir les translations dès le départ (?)
    De mémoire, pour établir la formule, il faut projeter les axes du système destination dans le système origine.
    Il faut faire intervenir l'angle de rotation de chaque axe. A première vue, c'est tout de même un calcul compliqué.
    S'il n'y a pas d'autre solution, je veux bien le faire (?)
    Cordialement.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Citation Envoyé par ryu20 Voir le message
    jLa matrice de passage donne donc
    Ux Vx Wx Ex
    Uy Vy Wy Ey
    Uz Vz Wz Ez
    .0. .0. .0. 1
    C'est ca, mais attention c'est la matrice de passage de R2 vers R1. Si tu es bien d'accord avec ca et que tu ne trouves pas les résultats escomptés c'est que tu te trompes dans le sens de la multiplication. Comme tu travailles avec des vecteurs colonnes, il faut multiplier a gauche.

    Soit P1 les coordonnées d un point exprimé dans R1 et P2 les coordonnées de ce même point exprimé dans R2. Soit M21 la matrice de passage de R2 vers R1 (celle que tu donnes au dessus)

    Alors P2 = M21 x P1

    La matrice de passage M12 qui permet de passer de R1 a R2 est quand a elle l'inverse de M21.

    Si tu travailles avec des repere orthonormés, c'est a dire que M21 est la composition d'une rotation et d'un translation alors on peux décomposer :

    M21 = T x R
    d'ou M12 = inv(T x R) = inv(R) x inv(T)
    R etant une rotation, donc une matrice orthogonale, son inverse est égale a sa transposée. L'inverse d'une translation quand a elle etant simplement la translation inverse (inversion du signe des coordonnées)

    On a donc :
    M12 = t(R) x inv(T)

    Soit en faisant le calcul :

    M12 =
    Ux Uy Uz -Ux*Ex-Uy*Ey-Uz*Ez
    Vx Vy Vz -Vx*Ex-Vy*Ey-Vz*Ez
    Wx Wy Wz -Wx*Ex-Wy*Ey-Wz*Ez
    0 0 0 1
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 79
    Points
    79
    Par défaut
    Je ne te remercierai jamais assez...
    j'aurai pu chercher longtemps avant de trouver mon erreur.

    merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/04/2011, 17h53
  2. Matrice de changement de Base/repere
    Par Ange_blond dans le forum Mathématiques
    Réponses: 3
    Dernier message: 05/02/2009, 12h14
  3. Matrice de changement de Base/repere
    Par Ange_blond dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 04/02/2009, 11h28
  4. [3D] changement de repere
    Par kacedda dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/05/2006, 15h24
  5. URGENT : Zoom et changement de repère
    Par poca10 dans le forum MFC
    Réponses: 5
    Dernier message: 28/05/2002, 13h32

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