Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux
Développement 2D, 3D et Jeux Forum développement 2D, 3D et Jeux. Avant de poster : Les FAQs Programmation 2D, 3D et Jeux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2012, 18h41   #1
Candidat au titre de Membre du Club
 
Femme Laurence
Étudiant
Inscription : août 2007
Messages : 61
Détails du profil
Informations personnelles :
Nom : Femme Laurence
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 61
Points : 12
Points : 12
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
laurencew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 19h43   #2
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2004
Messages : 2 984
Points : 4 691
Points : 4 691
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"

Si vous avez un terrain constructible dans l'est du Gers à vendre pas trop cher, contactez-moi par MP.

Ma page sur DVP.com : articles Java/Jogl
Mon site www.plegat.org
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 19h37   #3
Candidat au titre de Membre du Club
 
Femme Laurence
Étudiant
Inscription : août 2007
Messages : 61
Détails du profil
Informations personnelles :
Nom : Femme Laurence
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 61
Points : 12
Points : 12
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.
laurencew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 19h51   #4
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2004
Messages : 2 984
Points : 4 691
Points : 4 691
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"

Si vous avez un terrain constructible dans l'est du Gers à vendre pas trop cher, contactez-moi par MP.

Ma page sur DVP.com : articles Java/Jogl
Mon site www.plegat.org
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 10h41   #5
Candidat au titre de Membre du Club
 
Femme Laurence
Étudiant
Inscription : août 2007
Messages : 61
Détails du profil
Informations personnelles :
Nom : Femme Laurence
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 61
Points : 12
Points : 12
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 ?
laurencew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 13h06   #6
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2004
Messages : 2 984
Points : 4 691
Points : 4 691
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"

Si vous avez un terrain constructible dans l'est du Gers à vendre pas trop cher, contactez-moi par MP.

Ma page sur DVP.com : articles Java/Jogl
Mon site www.plegat.org
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 14h50   #7
Candidat au titre de Membre du Club
 
Femme Laurence
Étudiant
Inscription : août 2007
Messages : 61
Détails du profil
Informations personnelles :
Nom : Femme Laurence
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 61
Points : 12
Points : 12
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 ?
laurencew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 19h07   #8
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2004
Messages : 2 984
Points : 4 691
Points : 4 691
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"

Si vous avez un terrain constructible dans l'est du Gers à vendre pas trop cher, contactez-moi par MP.

Ma page sur DVP.com : articles Java/Jogl
Mon site www.plegat.org
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h53   #9
Candidat au titre de Membre du Club
 
Femme Laurence
Étudiant
Inscription : août 2007
Messages : 61
Détails du profil
Informations personnelles :
Nom : Femme Laurence
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 61
Points : 12
Points : 12
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.
laurencew est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 13h33   #10
Expert Confirmé Sénior
 
Jean-Michel BORLOT
Fabricant et casseur d'avions
Inscription : avril 2004
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Jean-Michel BORLOT
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2004
Messages : 2 984
Points : 4 691
Points : 4 691
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"

Si vous avez un terrain constructible dans l'est du Gers à vendre pas trop cher, contactez-moi par MP.

Ma page sur DVP.com : articles Java/Jogl
Mon site www.plegat.org
plegat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h12   #11
Membre Expert
 
Avatar de Ange_blond
 
Homme Vincent Bourdier
Ingénieur développement en 3D temps réel
Inscription : mars 2007
Messages : 829
Détails du profil
Informations personnelles :
Nom : Homme Vincent Bourdier
Âge : 26
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 : 829
Points : 1 118
Points : 1 118
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 :
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
__________________
"le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

Ange3d.developpez.com - tutos OpenSceneGraph

Ni ma boite de MP ni ma page de profil ne sont des extensions du forum OpenSceneGraph ! Merci.
Ange_blond est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h04.


 
 
 
 
Partenaires

Hébergement Web