# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Projection orthogonal et intersection deux de droites

## darkman19320

Bonjour tout le monde!
J'ai un cube dans l'espace. A partir de n'importe quel point de l'espace, je souhaiterais obtenir le point associ  une des faces du cube.
Pour cela je pensais faire une projection orthogonale d'un point 3D sur un plan (une des faces de mon cube) puis projeter le point obtenu dans la face associ  mon plan.

Voici une image rsumant (ou tout essaye de rendre comprhensible ce que j'essaye d'expliquer  :;): ):


J'ai russi  obtenir l'quation du plan  partir de trois points d'une des faces:


```

```

Je pense que le calcul de l'quation du plan est correct mais je ne comprends pas: 
          1> comment faire pour calculer le projet orthogonal de n'importe quel points de l'espace?
          2> comment faire une translation du projet vers la face du cube (si et seulement si le projet n'est pas dj dans la face).
          3> Est-il possible de passer du point A (sur la figure) au point A" en un seul systme d'quation (matrice de projection + translation?)?

Merci d'avance.

----------


## Jean Dumoncel

Bonjour,

(dis-donc, c'est bien de penser aux malvoyants et  ceux qui ont un petit cran, mais elle est un peu norme ton image...)

Chercher le projet orthogonal, c'est chercher l'intersection entre le plan et la droite perpendiculaire au plan passant par le point.
Pour l'intersection entre un plan et une ligne :
Subject 5.05: How do I find the intersection of a line and a plane?
(tu peux facilement trouver l'quation paramtrique de la droite en utilisant un vecteur normal  ton plan)

(une remarque au cas ou : on est bien d'accord que les faces de ton cube ne sont pas parallle aux axes de ton repre?)

----------


## darkman19320

Merci pour ta rponse.
Mon cube n'est pas forcment parallle  mon repre.
Je vais essayer ce que tu m'as dit et je vous tiens au courant.

----------


## Nebulix

_le point associ_
C'est quoi  ?

----------


## darkman19320

Bonjour,
Dsol pour la rponse tardive j'avais un autre projet en cours...
Donc pour rpondre  ta question Nebulix, le point associ est en fait le projet orthogonale de A sur le segment de ma bounding Box ou sur l'une des faces de celle-ci.

Je pense avoir russi  trouver le projet orthogonal d'un point sur un plan et le projet d'un point sur la droite.
Voici le code que j'utilise pour la projection d'un point dans le plan


```

```

Et celui-ci pour la projection d'un point sur une droite:


```

```

Me serais-je tromp dans mes calculs?

Merci d'avance.


Edit: Aprs vrification, mes calculs sont corrects (j'ai fait plusieurs test d'appartenance ou non d'un point  une ligne ou un plan et les rsultats semblent corrects).

----------


## darkman19320

Bonjour,
Je pense avoir compris mon problme: le point d'origine (par exemple le point A ou B sur le dessin) n'a pas la profondeur souhaite.
Pour information, je rcupre ce point  partir de la fonction glUnProject de OpenGL (voir Problme affichage de points  partir d'un clic de souris. Je lui passe en paramtre ma matrice de transformation (MODELVIEW_MATRIX), ma matrice de projection (PROJECTION_MATRIX) ainsi que les coordonnes de ma souris (donc en 2D) et un tableau pour rcuprer les 3 coordonnes du monde OpenGL.
Je pense que le problme vient de ma matrice de projection.

J'ai pensais  une autre solution: tester la distance entre les coordonnes de la souris et les diffrentes droites de ma bounding box et prendre la distance la plus petite mais malheureusement le rsultat n'est pas concluant... Je crois savoir pourquoi: je teste les coordonnes 2D de ma souris avec les coordonnes 3D de mes droites de la bounding box.

Donc ma question est la suivante: peut-on rcuprer les coordonnes 2D (de l'cran donc)  partir des coordonnes 3D (les coordonnes OpenGL)?

Merci d'avance.

----------


## pseudocode

bonjour,

Une question en passant : quel tait le problme de dpart qui a donn lieu  tous ces calculs ?

----------


## darkman19320

Mon problme est le suivant:
Je souhaite effectuer du clipping et donc j'ai besoin d'un plan. A partir d'un clic de souris, je souhaiterais obtenir les coordonnes d'un des trois points ncessaire pour crer le plan. J'aimerais que ces coordonnes soient sur un des segments de ma bounding box ou sur une de ces faces.
Une fois que j'ai mes trois points, je calcule l'quation de mon plan et j'effectue le clipping.

Suis-je assez clair?

----------


## pseudocode

> Mon problme est le suivant:
> Je souhaite effectuer du clipping et donc j'ai besoin d'un plan. A partir d'un clic de souris, je souhaiterais obtenir les coordonnes d'un des trois points ncessaire pour crer le plan. J'aimerais que ces coordonnes soient sur un des segments de ma bounding box ou sur une de ces faces.
> Une fois que j'ai mes trois points, je calcule l'quation de mon plan et j'effectue le clipping.
> 
> Suis-je assez clair?


Ah.

tant donn que les coordonnes du clic souris sont en 2D il y a deux approches:

a. Projeter le modles 3D sur l'cran 2D et faire la recherche du point optimal en 2D, puis retourner en 3D.

b. passer les coordonnes du clic en 3D et faire la recherche du point en 3D.


Les deux approches sont jouables. La premire me semble plus habituelle si j'en juge les softs de conception 3D que j'ai pu voir.

----------


## darkman19320

Ok merci.

Pour la premire mthode, j'utilise gluProject c'est a?
Si c'est le cas, peux-tu me dire si la mthode que j'utilise est correcte:
Utiliser gluUnProject pour rcuprer les coordonnes OpenGL de ma sourisRcuprer toutes les coordonnes cran des 8 points de ma bounding box (en utilisant gluProject)Rcuprer les coordonnes cran de ma souris (donc peut-tre tape 1 non ncessaire)A partir des coordonnes cran (de la souris et des point de la bounding box), chercher le plan le plus procheSi le point projet dans le plan est  l'intrieur de la face (de la bounding box) associ  ce plan, on rcupre les coordonnes 3D avec gluUnProjectSinon rechercher la droite la plus proche du point projetSi le point projet sur la droite est  l'intrieur du segment contenu dans cette droite, alors on rcupre les coordonnes 3D avec gluUnProjectSinon prendre le point le plus proche du point projet sur la droite et rcuprer les coordonnes 3D de ce point.

Merci

----------


## pseudocode

Disons que ca me semble logique. 

Bon, pour le cas #8, je sais pas trop le rsultat que ca va donner. Ca correspondrait au point "A" dans ton image initiale. Dans ce cas, je trouve que c'est dur de trouver ce que voulait faire l'utilisateur.  ::aie::

----------


## darkman19320

C'est vrai que ca risque d'tre bizarre...

Peut-tre que je devrais juste faire un picking sur les faces de la bounding box et rcuprer le point intersect non? 
Mais si je fais a l'utilisateur sera oblig de cliqu sur la bounding box... (pas forcment gnant non plus)

----------


## pseudocode

> C'est vrai que ca risque d'tre bizarre...
> 
> Peut-tre que je devrais juste faire un picking sur les faces de la bounding box et rcuprer le point intersect non? 
> Mais si je fais a l'utilisateur sera oblig de cliqu sur la bounding box... (pas forcment gnant non plus)


Oui, c'est la mthode la plus usuelle. Avec un bouton ("tab") pour pouvoir choisir un des autres points possibles en cas de solutions multiples

----------


## darkman19320

Ok merci.
Par contre petite question je voulais faire un picking avec gluPickMatrix mais est-ce que l'on peut rcuprer directement les coordonnes des points d'intersections?
Ou peut-on utiliser le color picking et rcuprer le point d'intersection?

----------


## pseudocode

> Ok merci.
> Par contre petite question je voulais faire un picking avec gluPickMatrix mais est-ce que l'on peut rcuprer directement les coordonnes des points d'intersections?


Je ne pense pas que OpenGL sache calculer les intersections entre un rayon et la scne.




> Ou peut-on utiliser le color picking et rcuprer le point d'intersection?


Heu, je ne pense pas. On peut juste rcuprer l'objet mais c'est tout. C'est dj pas mal. Le calcul d'intersection rayon/box n'est pas trs compliqu

----------


## darkman19320

Merci beaucoup pour tes rponses.

Je ne suis pas trop familier avec le lancer de rayon... Je comprends le principe:  partir d'un point d'origine et d'un vecteur directeur, on calcule l'intersection entre le rayon et le (les) objets  tester.
J'ai plusieurs questions:
 1) Comment trouve-t-on le vecteur directeur? C'est  nous de le dfinir?
Si c'est le cas, pour avoir un rayon parallle  un plan xOy (en tant dans le repre Oxyz), le vecteur directeur d doit tre gal  (0,0,1)?
 2) Je n'ai pas compris le code fournis par ce site: Ray-Box Intersection Algorithm.


```

```

.
Surtout  quoi correspondent les tmin tmax, tymin, tymax, tzmin et tzmax. Ces variables peuvent-elles nous donner les coordonnes du point d'intersection?

(Dsol pour ces questions certainement trs simple  comprendre...)

----------


## pseudocode

> 1) Comment trouve-t-on le vecteur directeur? C'est  nous de le dfinir?


Oui. Gnralement c'est le vecteur passant par le point de vue (camera) et le point vis par la souris (=coordonnes 3D dans le plan de l'ecran)




> Si c'est le cas, pour avoir un rayon parallle  un plan xOy (en tant dans le repre Oxyz), le vecteur directeur d doit tre gal  (0,0,1)?


heu... oui. Si tant est que j'ai compris ce qu'est un rayon parallle a un plan.




> 2) Je n'ai pas compris le code fournis par ce site


C'est un algo pour savoir si un rayon intersecte une box. Mais ca ne donne pas les coordonnes de l'intersection. Le principe habituel c'est de se ramener au cas d'une box aligne sur les 3 axes (axis-aligned box) en appliquant la rotation inverse au rayon.

----------


## darkman19320

Bonjour,

Merci pour ta rponse. J'ai trouv quelques papiers sur l'intersection des axes-aligned bounding box (Fast Ray-Axis Aligned Bounding Box Overlap Tests with Plucker Coordinates
, Fast Ray/Axis-Aligned Bounding
Box Overlap Tests using Ray Slopes
) mais je ne comprends pas comment rcuprer les coordonnes du point d'intersection  partir des algos dcrit...
As-tu des algos  me conseiller? 

PS: Je n'ai absolument pas compris l'histoire de rotation inverse du rayon...

----------


## pseudocode

> Merci pour ta rponse. J'ai trouv quelques papiers sur l'intersection des axes-aligned bounding box (Fast Ray-Axis Aligned Bounding Box Overlap Tests with Plucker Coordinates
> , Fast Ray/Axis-Aligned Bounding
> Box Overlap Tests using Ray Slopes
> ) mais je ne comprends pas comment rcuprer les coordonnes du point d'intersection  partir des algos dcrit...
> As-tu des algos  me conseiller?


Tous ces algos font seulement le "test" pour savoir si le rayon intersecte la box (ils retournent true/false). Mais ils ne calculent pas les coordonnes d'intersection.

Tu as un algo basique dans GraphicsGems : http://tog.acm.org/resources/GraphicsGems/gems/RayBox.c

En cas d'intersection (la fonction retourne true) les coordonnes sont retournes dans le tableau coord[]






> PS: Je n'ai absolument pas compris l'histoire de rotation inverse du rayon...


Un rayon horizontal qui se dirige vers une Box orient a 45, c'est la meme chose qu'un rayon orient  -45 qui se dirige vers une Box horizontale. C'est juste un changement de repre  :;):

----------


## darkman19320

Merci beaucoup pour tes rponses!!
J'arrive au bout ^^
Il ne me manque plus qu' corriger les coordonnes de la direction et de l'origine de mon rayon en fonction de la rotation de ma bounding box.
Donc si je ne me trompe pas, il faut que je multiplie les deux vecteurs (origine et direction) par la matrice de rotation au tour d'un axe quelconque?

----------


## pseudocode

> Merci beaucoup pour tes rponses!!
> J'arrive au bout ^^
> Il ne me manque plus qu' corriger les coordonnes de la direction et de l'origine de mon rayon en fonction de la rotation de ma bounding box.
> Donc si je ne me trompe pas, il faut que je multiplie les deux vecteurs (origine et direction) par la matrice de rotation au tour d'un axe quelconque?


Tu utilises la matrice inverse de celle de la bounding box, ce qui revient a construire une matrice de faisant les oprations opposes (rotation de l'angle oppos, translation de la valeur oppos, ...)

----------

