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

Développement 2D, 3D et Jeux Discussion :

projection de points 3D sur un plan


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut projection de points 3D sur un plan
    Bonjour,

    J'ai un ensemble de points dans un espace à trois dimensions et je souhaite projeter ces points sur un plan afin de les avoir en deux dimensions.

    Après quelques recherches, j'ai vu que pour faire cela, je pouvais faire un changement de repère, de celui des points au repère du plan. Je dois donc trouver la matrice de passage et les appliquer à tous les points. Je ne garde ensuite que les deux premières coordonnées. Est-ce que la méthode est correcte ?

    Mon plan est défini par une normale N (xn, yn, zn) et une distance d à l'origine. De ces infos, j'en déduit l'équation du plan qui est : a xn + b yn + c zn + d = 0.

    J'essaie ensuite de calculer deux points sur ce plan pour avoir un vecteur E1 et pouvoir calculer E2 avec le produit vectoriel de E1 et la normale N. Cela me permet de calculer la matrice de passage en mettant E1 dans la 1e colonne d'une matrice M, E2 dans la 2e et la normale N dans la 3e colonne. Je multiplie pour finir mes points par cette matrice pour les avoir dans le repère du plan.

    Sinon, j'ai quelques soucis dans le cas où l'une des coordonnées de lq normale au plan est nulle pour calculer mes deux points P1 et P2 sur le plan (me permettant d'obtenir E1). Pour P1, je choisis x = 0 et y = 0, ce qui me permet de trouver z = -d / c et pour P2, je choisis x = 1 et y = 0 et donc z = (-a - d) / c. Mais je suis coincé par les cas ou les plans sont parallèlles à l'un des trois axes.

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Salut,

    Citation Envoyé par laurencew Voir le message
    Mon plan est défini par une normale N (xn, yn, zn) et une distance d à l'origine. De ces infos, j'en déduit l'équation du plan qui est : a xn + b yn + c zn + d = 0.
    xn.x+yn.y+zn.z+d=0 non, plutôt? A moins que ce ne soit ton vecteur normal qui ait pour coordonnées (a,b,c) (vecteur normé évidemment).


    Citation Envoyé par laurencew Voir le message
    Mais je suis coincé par les cas ou les plans sont parallèlles à l'un des trois axes.
    J'ai du mal à voir comment tu pourrais être coincé dans un tel cas.
    C'est le plus simple, si un plan est parallèle à un axe, le vecteur directeur de cet axe se projète en lui-même... donc aucun calcul à faire pour avoir le premier vecteur.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Oui effectivement je me suis emmêlée : mon vecteur normal défini par (a, b, c) me permet de définir les coefficients a, b et c dans l'équation du plan ax + by + cz + d = 0 (avec ma distance pour remplacer d).

    Sinon, je disais que j'étais coincé par les trois cas où le plan est parallèle à l'un des axes, car ça ne me permet pas d'appliquer une solution générale valable pour tous les vecteurs normaux possibles. Je suis obligée de faire des if pour traiter ces cas particuliers, alors que j'aurai souhaitais appliquer une solution générale.

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par laurencew Voir le message
    Sinon, je disais que j'étais coincé par les trois cas où le plan est parallèle à l'un des axes, car ça ne me permet pas d'appliquer une solution générale valable pour tous les vecteurs normaux possibles. Je suis obligée de faire des if pour traiter ces cas particuliers, alors que j'aurai souhaitais appliquer une solution générale.
    Tu n'as qu'un seul cas particulier à gérer, celui où la normale à ton plan est le vecteur Ox. Dans tous les autres cas, tu projètes Ox sur ton plan, afin d'avoir le premier vecteur, et tu fais le produit vectoriel avec la normale pour avoir le second axe.

    Dans le cas où ta normale est Ox, tu prends Oy, que tu projètes sur ton plan pour avoir le premier vecteur, et tu continues pareil.

    Bref, ça se gère avec un unique "if" qui va définir le vecteur de base à projeter, Ox ou Oy...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Ok, merci plegat. Donc soit je projete le vecteur Ox (1, 0, 0 ?), soit Oy (0, 1, 0 ?) sur mon plan et je fais le produit vectoriel avec ma normal pour obtenir le troisième (c'est ça ? pas le deuxième) axe du repère de mon plan. Mais du coup ça m'amène à un nouveau problème : comment on projete un vecteur sur un plan ?

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par laurencew Voir le message
    et je fais le produit vectoriel avec ma normal pour obtenir le troisième (c'est ça ? pas le deuxième) axe du repère de mon plan.
    Ben non, ça sera le second... le premier c'est celui que tu as projeté. Et pour un plan, il suffit de deux axes. Donc le second, c'est le produit vectoriel du premier et de la normale.. à moins que tu ne comptes la normale comme un axe...

    Citation Envoyé par laurencew Voir le message
    Mais du coup ça m'amène à un nouveau problème : comment on projete un vecteur sur un plan ?
    hum... ceci étant une question plus que banale sur la toile, soit je fais la recherche à ta place, soit tu la fais...
    un vecteur, c'est deux points... je pense que tu vas trouver suffisamment d'infos avec ça.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Oui, je considerais ma normal comme un des trois axes du repère du plan.

    Donc je peux construire une matrice de passage dans le repère du plan avec seulement deux vecteurs (mon vecteur Ox ou Oy projeté et le vecteur issu du produit vectoriel entre le vecteur projeté et la normal) ? J'ai donc une matrice 2x2, il faut donc prendre en compte que les deux premières composantes x et y des points 3d pour les multiplier avec cette matrice, et ils sont dans le repère du plan, c'est ça ?

    Par contre comment savoir quel vecteur mettre dans la premiere colonne de la matrice de passage, le vecteur projeté ou l'autre issu du produit vectoriel ?

  8. #8
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Relis ton premier post, tu as expliqué la méthode.

    Je crois que maintenant il est temps d'arrêter de te poser des questions et de mettre ça en application...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    J'ai codé tout ça, ça marche dans la majorité des cas, mais j'ai toujours des soucis pour des cas particuliers.

    Prenons un exemple : mon vecteur normal = (0, 1, 0) et d = 0. J'ai donc un plan parallèle à XZ. Mon vecteur n'est pas Ox, je projete donc Ox sur mon plan. Suivant ma méthode, je cherche la coordonnée z du point en 0, 0 soit z = -d / c => -inf (comme d et c sont = 0). Pareil pour le point en 1, 0 : z = -inf. Je ne peux donc pas me servir de ce vecteur dans ce cas.

    Je n'arrive pas à trouver une méthode générale de calcul des points qui marche si a, b, c et/ou d sont nuls. C'est ce que je disais dans mon premier post au sujet des plans parallèles aux axes. Désolée si je n'ai peut-être pas été claire.

  10. #10
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par laurencew Voir le message
    Prenons un exemple : mon vecteur normal = (0, 1, 0) et d = 0. J'ai donc un plan parallèle à XZ. Mon vecteur n'est pas Ox, je projete donc Ox sur mon plan. Suivant ma méthode, je cherche la coordonnée z du point en 0, 0 soit z = -d / c => -inf (comme d et c sont = 0). Pareil pour le point en 1, 0 : z = -inf. Je ne peux donc pas me servir de ce vecteur dans ce cas.
    Il y a tout de même un petit problème de logique dans ta démarche là... tu as un plan XZ, donc pour lequel tous les points sont à Y=0, et tu vas cherche LE point qui aurait Y=0... tu penses bien que ça ne fonctionne pas. Va plutôt chercher le point ayant (x=0,z=0) si vraiment tu veux conserver ta manipulation où tu conserves uniquement deux coordonnées.

    De toute façon, si tu veux faire du générique, il te faut faire une projection orthogonale sur ton plan, et pas uniquement une manip où tu conserves les deux premières coordonnées (cf mon post de hier 13h06 où je te conseille de projeter le vecteur sur le plan... et où je te laisse chercher de la doc, mais apparemment tu es resté sur ce que tu avais déjà fait). Comme tu l'as vu pour un plan de normale Oy, dans ce cas ça ne fonctionne pas, et pour un plan qui sera un peu désaxé tu vas envoyer ton point projeté à l'infini et tu vas également planter ton calcul.

    Au passage, 0/0 ça ne donne pas -inf... pas en informatique en tous cas, mais NaN (sauf langage exotique).
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  11. #11
    Membre émérite
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Par défaut
    J'arrive peut etre apres la guerre, j'ai eu la flemme de tout lire

    moi pour projeter un point sur un plan je fait ceci : (avec v1, v2 et v3 3 points qui forment le plan, _pt le point que je cherche a projeter et proj mon point projeté dans le plan selon la normale au plan)

    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
     
    //get the plan cartesien equation
     
    				// ax + by + cz + d = 0
    				double a, b, c, d;
    				//compute the normal
    				osg::Vec3d n = (v2-v1)^(v3-v1);//let's consider point are in the good order to have default normal (anti-clockwise)
    				n.normalize();
     
    				a = n[0];
    				b = n[1];
    				c = n[2];
    				d = (-n)*v1;
     
    				//get the point projection on the plane
     
    				double proj_length = osg::absolute<double>(_pt[0]*a+_pt[1]*b+_pt[2]*c+d) / sqrt(a*a+b*b+c*c);
    				osg::Vec3d proj = _pt - n*proj_length;//because n has been normalized

Discussions similaires

  1. Projection d'un ellipsoïde sur le plan image
    Par studentTun dans le forum Mathématiques
    Réponses: 2
    Dernier message: 03/05/2013, 14h54
  2. Projection d'un ensemble des points 3D sur un Plan 2D
    Par fraisa1985 dans le forum Traitement d'images
    Réponses: 13
    Dernier message: 23/07/2010, 11h07
  3. projection de points sur une structure utilisant une image
    Par speedy_g dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 17/09/2007, 10h33
  4. Projection de points sur un plan
    Par bernard6 dans le forum MATLAB
    Réponses: 7
    Dernier message: 23/07/2007, 16h26
  5. Réponses: 4
    Dernier message: 27/11/2006, 18h06

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