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

MATLAB Discussion :

createBasisTransform3d changement de repere


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 173
    Points : 99
    Points
    99
    Par défaut createBasisTransform3d changement de repere
    Bonjour ,
    j'ai un souci avec l'utilisation de la fonction createBasisTransform3d pour son utilisation avec 3 plans.
    Avec un seul plan, c'est ok voir le script.
    Avec 3 plans, ca ne fonctionne pas correctement voir le script
    A priori c'est transformPoint3d que j'utilise mal. Une idée de ce qui ne va pas ?

    Imagingall



    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    clc
    clear all
    fprintf(' avec 1 plan\n ');
    Plane1dans1=[0 0 0 1 0 0 0 1 0];
    Plane2dans1 = [5 50 500 1 0 0 0 1 0];
    Adans1=[3 8 2];
    % Adans1=[5 50 500]
    % Adans1=[0 0 0]
    Tform1= createBasisTransform3d(Plane1dans1, Plane2dans1);
    Adans2 = transformPoint3d(Adans1, Tform1);
     
    % Coord de plane 1 dans plane 2
    % Plane1dans2= -Plane2dans1  % ok ? 
    Plane1dans2= [-5 -50 -500 1 0 0 0 1 0];
    Plane2dans2 = [0 0 0 1 0 0 0 1 0];
     
    Tform2 = createBasisTransform3d(Plane2dans2, Plane1dans2);
    Adans2dans1 = transformPoint3d(Adans2, Tform2);
     
     
    fprintf(' le point Adans1 dans le repere 1 : \n'); disp(Adans1);
    fprintf(' dans le repere 2 : \n'); disp(Adans2);
    fprintf('et reprojete dans le repere 1 \n'); disp(Adans2dans1);
    fprintf(' identique au départ : Adans1==Adans2dans1 ->>>>>>>>>> ');
    disp(Adans1==Adans2dans1);
     
    fprintf('-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*');
    fprintf(' \n avec 3 plans\n ');
     
    pS=[120.3934  140.9860  495.6667         0    0.1516    0.9884   -0.3200   -0.9365    0.1436];
    pC=[  120.3934  140.9860  495.6667         0   -0.2296    0.9733   -0.9543   0.2909    0.0686]   ;
    pT=[  120.3934  140.9860  495.6667         0   -0.9809   -0.1943   -0.9934 0.0222   -0.1122];
    Plane2dans1=[pS;pT;pC];
     
    Tform1= createBasisTransform3d('global',Plane2dans1);
    Adans21 = transformPoint3d(Adans1, Tform1(:,:,1));
    Adans22 = transformPoint3d(Adans1, Tform1(:,:,2));
    Adans23 = transformPoint3d(Adans1, Tform1(:,:,2));
     
    Adans2=[Adans21(1),Adans21(2),Adans23(3)];
     
    pS2=[pS(1:3)*-1,pS(4:9)];
    pC2=[pC(1:3)*-1,pC(4:9)];
    pT2=[pT(1:3)*-1,pT(4:9)];
    Plane2dans1=[pS2;pT2;pC2];
     
    Tform2 = createBasisTransform3d('global', Plane2dans1);
     
    Adans211 = transformPoint3d(Adans2, Tform2(:,:,1));
    Adans212 = transformPoint3d(Adans2, Tform2(:,:,2));
    Adans213 = transformPoint3d(Adans2, Tform2(:,:,2));
    Adans2dans1=[Adans211(1),Adans212(2),Adans213(3)];
     
    fprintf(' le point Adans1 dans le repere 1 : \n'); disp(Adans1);
    fprintf(' dans le repere 2 : \n'); disp(Adans2);
    fprintf('et reprojete dans le repere 1 \n'); disp(Adans2dans1);
    fprintf(' Identique au départ ??? : Adans1==Adans2dans1      ->>>>>>>>>>');
    disp(Adans1==Adans2dans1);

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 173
    Points : 99
    Points
    99
    Par défaut
    Voici une autre façon de faire, toujours gràce à geom3D
    https://fr.mathworks.com/matlabcentr....mathworks.com

    j'ai en données d'entrée : 3 points par plan et on créer un nouveau système tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    T1 = [118.9280  134.4303  496.0000]
    T2 =[133.9675  140.6775  496.0000]
    T3 =[108.2846  147.8502  495.0000]
    S1 =[118.8891  141.3713  494.0000]
    S2 =[154.3271  201.1969  192.0000]
    S3 =[164.9967  254.9256  334.0000]
    C1 =[133.3691  177.5715  371.0000]
    C2 =[91.0721  210.7232  311.0000]
    C3 =[207.6748  166.1398  311.0000]
     
     
    [pS,pC,pT]=computenewsystem_mlb(T1, T2, T3,C1, C2, C3,S1, S2, S3)
    avec la fonction computenewsystem_mlb
    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
    function [pS,pC,pT]=computenewsystem_mlb(T1, T2, T3,C1, C2, C3,S1, S2, S3)
     
    ptsh=[(T1(1)+T2(1))/2,(T1(2)+T2(2))/2,(T1(3)+T2(3))/2];% point au milieu de T1 et T2
     
    PLANET = createPlane(T1, T2, T3) 
    PLANEC = createPlane(C1, C2, C3) 
    PLANES = createPlane(S1, S2, S3) 
    lineTC=intersectPlanes(PLANET, PLANEC)
    Obis=intersectLinePlane(lineTC, PLANES)
     
    u=S1-S2;
    v=S1-S3;
     
    per=cross(u,v); % per est perpendiculaire à S
    pS=createPlane(Obis, per);   % plan1 p123 X
     
    ptshproj=projPointOnPlane(ptsh, pS);
     
    w=ptsh-ptshproj;
    perH=cross(w,u);
    pC=createPlane(Obis, perH); % plan2 pH Y 
     
    line1=intersectPlanes(pS,pC)
    pT=createPlane(Obis, line1(4:6));   % plan3 Z
    Je ne suis pas sûr de moi, quelqu'un peut me confirmer que ça fonctionne correctement ?


    Avec des points dans le systeme de depart allptsOri et la fonction ChangerepereSerie_mlb on a :
    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
    % check it's ok 
    dihedralAngle(pS,pT)*180/pi
    dihedralAngle(pS,pC)*180/pi
    dihedralAngle(pC,pT)*180/pi
     
    % test des points 
    allptsOri =[0     0     0,
        27    28    27,
        30    30    30,
        30    30    25]
     
    figure('Name','Ori','NumberTitle','off');
    drawPoint3d(allptsOri)
     
    close all
    allptsOriprime=ChangerepereSerie_mlb(pS,pC,pT,allptsOri)  
     
    figure('Name','Ori','NumberTitle','off');
            drawPoint3d(allptsOri)
            line=fitLine3d(allptsOri)
    drawLine3d(line, 'color', 'm', 'LineWidth', 4);
     
     
    figure('Name','Trans','NumberTitle','off');
            drawPoint3d(allptsOriprime)
            lineleftprime=fitLine3d(allptsOriprime)
    drawLine3d(lineleftprime, 'color', 'm', 'LineWidth', 4);


    fonction
    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
    function [listeprime] = ChangerepereSerie_mlb(pS,pC,pT,liste)
    % pS plane 1
    % pC plane 2
    % pT plane 3
    % A coordinnate on global system
    % return Aprime coordinnate on pS,pC,pT system
     
    TformS = createBasisTransform3d('global', pS); %
    TformC = createBasisTransform3d('global', pC); %
    TformT = createBasisTransform3d('global', pT); %
    [nbpt rien]=size(liste)
    listeprime=[]
    for n = 1:nbpt
    PT_WRT_PLANES = transformPoint3d(liste(n,:), TformS);
    PT_WRT_PLANEC = transformPoint3d(liste(n,:), TformC);
    PT_WRT_PLANET = transformPoint3d(liste(n,:), TformT);
    Aprime=round([PT_WRT_PLANES(1),PT_WRT_PLANEC(2),PT_WRT_PLANET(3)])
    listeprime=[listeprime;Aprime]
     
    end

    Ce sont les deux graphs qui me font douter ...
    Quelqu'un peut me donner un avis SVP.

  3. #3
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    Salut,

    la fonction createBasisTransform3d a pour but de convertir des coordonnées exprimées dans une base en coordonnées exprimées dans une autre base. Chaque base est définir par un point origine et par deux vecteurs directeurs (le troisième vecteur est déduit des deux premiers). Le mot-clé "global" correspond à la base centrée sur l'origine, avec (1,0,0) comme premier vecteur et (0,1,0) comme deuxième vecteur.

    Le résultat est une matrice de transformation, représentée par une matrice 4x4 en coordonnées homogènes. On peut obtenir la matrice 4x4 correspondant à la transformation inverse en inversant (!) la matrice.

    Quand les deux bases sont orientées avec les mêmes vecteurs (cas du premier script), alors effectivement, le passage d'une base à l'autre correspond à une simple translation, et on peut "bidouiller" en mutipliant les 3 premiers termes par -1. Mais en général ce n'est pas le cas.

    J'ai essayé de regarder le premier listing, mais j'ai eu du mal à suivre le but ... Une remarque : dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adans23 = transformPoint3d(Adans1, Tform1(:,:,2));
    , ça ne serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adans23 = transformPoint3d(Adans1, Tform1(:,:,3));
    ?


    A+

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 173
    Points : 99
    Points
    99
    Par défaut
    Bonjour,
    Je vous remercie pour votre remarque et votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adans23 = transformPoint3d(Adans1, Tform1(:,:,3));
    Concernant ceci :
    Citation Envoyé par Kangourou Voir le message
    Chaque base est définir par un point origine et par deux vecteurs normaux aux vecteurs directeurs (le troisième vecteur est déduit des deux premiers). Le mot-clé "global" correspond à la base centrée sur l'origine, avec (1,0,0) comme premier vecteur et (0,1,0) comme deuxième vecteur.
    Etes vous d'accord ?

    J'ai mes 3 plans pS, pT et pC définis selon
    PLANE = [X0 Y0 Z0 DX1 DY1 DZ1 DX2 DY2 DZ2]

    Ca ne semble pas correcte d'utiliser createBasisiTransform3d comme ceci,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysyst=[pS(1:6),pT(4:6)]
    Tform=createBasisTransform3d('global',mysyst)
    mais comment s'en sortir ?

    je vous remercie grandement pour votre aide,

  5. #5
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    Concernant ceci :
    Chaque base est définir par un point origine et par deux vecteurs normaux aux vecteurs directeurs (le troisième vecteur est déduit des deux premiers). Le mot-clé "global" correspond à la base centrée sur l'origine, avec (1,0,0) comme premier vecteur et (0,1,0) comme deuxième vecteur.
    Etes vous d'accord ?
    Non.
    Quand j'ai développé cette fonction de calcul de changement de coordonnées, je suis parti de la définition "classique" des bases et des repère orthogonaux, qui sont donc définis par un ensemble de vecteurs. J'ai rajouté la gestion du point origine pour travailler dans un espace affine.

    Je ne comprends pas la phrase sur les vecteurs normaux : si on a deux vecteurs, on peut définir un vecteur normal par cross-product, mais pas deux...

    A+

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/04/2011, 17h53
  2. changement de repere
    Par ryu20 dans le forum Moteurs 3D
    Réponses: 10
    Dernier message: 10/02/2010, 10h02
  3. Matrice de changement de Base/repere
    Par Ange_blond dans le forum Mathématiques
    Réponses: 3
    Dernier message: 05/02/2009, 12h14
  4. 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
  5. [3D] changement de repere
    Par kacedda dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/05/2006, 15h24

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