Position clickée dans une fenetre openGL

Position clickée dans une fenetre openGL - Programmation

Marsh Posté le 25-02-2002 à 14:24:38    

Salut,
  j'ai fais un logiciel (sous C++ builder) qui me permet d'afficher des objet 3D en openGL.
  Je voudrais pouvoir selectionner des points de ces objets en clickant dessus mais je sais pas trop comment faire pour récuperer des coordonnées 3D d'un point clické à l'écran... est-ce que quelqu'un à une idée?  
Merci!

Reply

Marsh Posté le 25-02-2002 à 14:24:38   

Reply

Marsh Posté le 25-02-2002 à 14:35:37    

Logiquement, tu peux pas obtenir les coordonnées 3D en précisant un point 2D :)
 
Je pense qu'il faut boucler sur les points de ton objet et que tu regardes si ses coordonnées "vérifient" l'équation de la droite que fait la camera et le point que tu as cliqué ... euhhh ... en tout cas c'est presque clair dans ma tete :)
 
Mais j'espere pour toi qu'il y a une autre technique :)

Reply

Marsh Posté le 25-02-2002 à 14:44:06    

Ben, pour l'instant c'est la seule chose que je vois aussi: déterminer l'équation de la droite correspondant au point clické à l'écran et en déduire le point le plus proche de la caméra correspondant... mais le probleme c'est que c'est des modèles avec plusieurs milliers de point alors même sur un P4 ca risque d'être un peu lent...

Reply

Marsh Posté le 25-02-2002 à 14:53:14    

Ha oui c'est clair que ça va ramer !!
 
Sinon, t'es obligé de faire ça en OpenGL ?
 
Si c'est un truc "pro" je crois que Cascade permet de faire des trucs sympa dans ce genre là ...

Reply

Marsh Posté le 25-02-2002 à 14:59:52    

Bah, pour ce qui est de l'OpenGL, j'ai déja développé pas mal de méthodes avec alors ca risque de pas être évident de changer...
 Sinon, c'est quoi Cascade?

Reply

Marsh Posté le 25-02-2002 à 15:09:43    

J'ai pas utilisé longtemps, mais si mes souvenirs sont corrects, c'est une librairie graphique qui permet de faire de la CAO ... je crois meme que Cascade est une "surcharge" d'OpenGL. Mais bon, c'est ultra ciblé ... et pis moi j'ai pas trop aimé :)

Reply

Marsh Posté le 25-02-2002 à 17:41:23    

Je viens d'aller voir leur site, je suis pas que Cascade gere ca... dommage, va falloir faire preuve d'ingéniosité si je veux pas qu'a chaque déplacement de ma souris il y ait 30 secondes de calcul...

Reply

Marsh Posté le 25-02-2002 à 17:48:24    

quand tu dis que tu veux sélectionner des points, j'imagine que tu ne t'interesse qu'aux vertex de tes objets
 
si c'est le cas, tu dois pouvoir accéder aux coordonnées 3D de ces vertex, et il ne te reste plus qu'a projeter sur l'écran pour obetnir leurs coordonnées 2D et comparer avec la position de ta souris

Reply

Marsh Posté le 25-02-2002 à 19:54:31    

C'est une bonne idée, fô que j'essaie mais j'ai peur que ce soit qd même assez lent.
Y'a pas une commande OGL qui permette de connaitre les coordonnées projetées des vertex?

Reply

Marsh Posté le 25-02-2002 à 20:11:29    

nbauten a écrit a écrit :

mais le probleme c'est que c'est des modèles avec plusieurs milliers de point alors même sur un P4 ca risque d'être un peu lent...


stratégie bourrin : calculer l'intersection avec la bbox - si intersection bbox, tester toutes les faces de l'objet. répéter pour chaque objet, à chaque intersection, remplir le tableau d'objets intersectés. trier en fonction de la profondeur des intersections -> tu as alors l'intersection la plus proche de la caméra.
 
quant à la vitesse, c'est ridicule. si tu fais ça sur un p2 350 avec des objets de dizaines de milliers de faces, alors oui ça prendra qq petites secondes. sinon c'est instantané. alors sur un p4 ...  
 
pour la commande ogl pour obtenir les coords projetés, il suffit de multiplier tes points par GL_MODELVIEW * GL_PROJECTION. tu as alors la projection en coords homogènes.  
 
pour te démerder à partir de là, tu cherches l'algo sur le forum, il a déjà été donné plusieurs fois.

Reply

Marsh Posté le 25-02-2002 à 20:11:29   

Reply

Marsh Posté le 25-02-2002 à 20:46:04    

Sinon, y'a peut être moyen de faire ça avec glRenderMode(GL_SELECT) :
 
Il parait que ca sélectionne les primitives qui sont dans une zone définie par l'utilisateur (donc ici le rayon (au sens raytracing) qui correspond à ton clic).
La démarche serait la suivante :  
creer un buffer
glRenderMode(....)
définir la zone avec les clipping planes
dessiner ta scene comme tu le ferais normalement
et opengl remplit ton buffer avec les primitives qui croisent ton rayon.
 
J'ai jamais essayé, mais je viens de voir ca dans la MSDN (recherche glRenderMode).
 
l'avantage avec cette méthode serait que t'as pas besoin de programmer grand chose, et que l'accélération amtérielle est utilisée

Reply

Marsh Posté le 25-02-2002 à 23:20:07    

allez regarder l'exemple
"picking" du SDK DirectX
ca vous fait pile
ce que vous voulez.
 
A+
LEGREG

Reply

Marsh Posté le 25-02-2002 à 23:23:02    

Sinon ceux qui font du raytracing
ont plutot des bonnes methodes d'organisation
de l'espace. (AABB, OBB, spheres ou octrees)
 
Aucun interet si tu as 10 objets
et que tu traces juste 1 rayon.
ca se fait a la vitesse de la lumiere.
 
A+
LEGREG

Reply

Marsh Posté le 28-02-2002 à 09:37:43    

Lorsque je tourne ma scene mes matrice de projection (récupérée avec glGetFloatv() )et modelview ne changent pas... c'est normal? ou c'est parce que je modifie seulement glulookat() pour me déplacer???

Reply

Marsh Posté le 28-02-2002 à 10:30:00    

a quel moment utilises-tu glulookat
et a quel moment recuperes-tu ta
matrice modelview?
Normalement la matrice de projection
ne change pas sauf si tu veux
changer ton viewport
(zoom, redimensionnement etc..)
 
A+
LEGREG

Reply

Marsh Posté le 28-02-2002 à 10:54:56    

J'suis pas sur que ce soit la bonne méthode mais en gros je fais comme ca:
 
//Initialisation avec les glEnable...
 
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-Rayon*ZOOM*ratio,Rayon*ZOOM*ratio,-Rayon*ZOOM,Rayon*ZOOM,
ZNear,ZFar);
 
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(Eye[0],Eye[1],Eye[2],Center[0],Center[1],Center[2],Up[0]
,Up[1],Up[2]);
 
glGetFloatv(GL_MODELVIEW_MATRIX,modelview);
glGetFloatv(GL_PROJECTION_MATRIX,projection);
 
//création des objets avec glBegin glEnd...
 
(1)
 
SwapBuffers(hdc);
 
 
Le problème c'est que dans ma fenêtre OGL j'affiche le repere en bas à droite et donc après avoir rendu ma scene principale je recrée un autre viewport dans la même fenetre (en (1) ) avec, pareil ma caméra qui tourne autour d'un triedre... C'est peut-êre légerement bourin comme méthode mais c'est ce que j'ai trouvé de lus rapide à développer.. c'est comme la caméra qui bouge, c'est plus intuitif que d'appliquer des matrices de rotations à la scène...
  En fait au départ je voulais juste faire un petit module de visualisation mais maintenant j'aimerai pouvoir voir les propriétés des points affichés à l'écran quand je clicke dessus (comme dans I-deas ou patran si y'en a qui connaissent). (car chaque point à des propriétés... numéro de référence, repère de définition...)
 
 Heu, je suis pas sur d'être clair là... :crazy:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed