Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1243 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  OpenGL: obtenir les coordonnées réelles

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

OpenGL: obtenir les coordonnées réelles

n°1052051
ptitchep
Posté le 19-04-2005 à 12:21:18  profilanswer
 

:hello: Bonjour  
 
J'aimerais savoir s'il existe une fonction permettant de connaitre les coordonnées d'un repère local (obtenu après de nombreux glPushMatrix() , glTranslatef() et glRotatef()) par rapport au repère d'origine.  
Sinon je suppose que c'est calculable à l'ancienne, dans ce cas si quelqu'un a une petite piste parce que je connais bien quelques formules de rotation et translation (avec sin et cos) mais j'ai du mal.
 
Merci


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 19-04-2005 à 12:21:18  profilanswer
 

n°1052088
retrox
Posté le 19-04-2005 à 13:13:56  profilanswer
 

Voir gluProject/gluUnProject

n°1053532
ptitchep
Posté le 20-04-2005 à 14:08:11  profilanswer
 

Je te remercie mais j'ai quelques pb avec gluProject:
- Les coordonnées ont l'air liées à la vue, elles changent si je déplace juste la caméra et pas l'objet alors qu'il me faudrait les coordonnées de mon objet par rapport au pt (0,0,0) du début(avant mon premier changement de repère)
- Les coordonnées renvoyées tournent autour des 900 pour x et -1100 pour y alors que tous mes objets sont dans une boîte cubique de 400 de coté
- Ma documentation est en anglais, ça aide pas...
Merci


---------------
deluser --remove-home ptitchep
n°1053944
retrox
Posté le 20-04-2005 à 17:16:02  profilanswer
 

Bon alors comme tu l'as compris il y a plusieurs types de coordonnées.
 
Il y a tout un processus qui permet de passer des coordonnées locales (souvent appelé en anglais "object space" ou "model space" ) aux coordonnées de fenetre ("window space" ou parfois "image space" , mais ça dépend du contexte). Entre ces 2 systemes, plusieurs intermédiaires sont utilisés.
 
Il y a tout d'abord les coordonnées globales ("world space" ). On y parvient en appliquant les transformations (translate/rotate/scale) liées à l'objet (où se trouve-t-il, quelle est son orientation etc...).
 
Ensuite, on passe des coordonnées globales aux coordonnées caméra ("camera space" ou plus souvent "eye space" ). Pour y parvenir, on applique les transformations liées à la caméra (ou se trouve l'observateur, vers ou regarde-t-il).
 
Une fois les coordonnées caméra connues, on passe dans ce qu'on appelle les coordonnées de clipping ("clip space" ). Pour cela, on applique la transformation liée au volume visualisation, appelé aussi frustum. C'est ce qu'on appelle la projection.
 
Apres le clipping, on applique la perspective, ce qui nous amene dans ce qu'on appelle les coordonnées de périphérique normalisées ("normalised device coordinates" ).
 
Enfin, on applique une derniere transformation qui correspond au viewport, c'est à dire la portion de fenetre qui va etre utilisée pour le dessin. Ceci nous donne (enfin) les coordonnées de fenetre ("window coordinates" ).
 
gluProject permet d'effectuer toutes ces étapes (de la meme maniere que ce sera effectué quand tu enverras tes vertex dans le pipeline) et de fournir le résultat. Si j'ai bien compris, toi ce qui t'intéresse c'est la premiere étape uniquement : passer de local en global. Pour ça il te faut la matrice objet. Comme tu le sais, OpenGL utilise une matrice MODELVIEW qui englobe les étapes 1 et 2. C'est à dire que dans la meme matrice, tu inscris la transformation liée à la caméra (par exemple avec gluLookAt) et la transformation liée à l'objet (glTranslate / Rotate / Scale).  
 
Sachant tout cela, tu as le choix : soit tu géneres directement la matrice objet, soit tu utilises OpenGL. Dans ce cas, tu pars d'une matrice identité, tu accumules les transformations (glTranslate & co), et tu récuperes le résultat avec un glGetFloatv(GL_MODELVIEW_MATRIX, mat); (mat etant un tableau de 16 floats).
 
Une fois que tu as la matrice objet, il ne reste qu'a multiplier les points à coordonnées locales par cette matrice pour obtenir les coordonnées globales.
 
 :hello:

n°1054066
ptitchep
Posté le 20-04-2005 à 18:48:28  profilanswer
 

Maintenant il y a de la lumière au bout du tunnel!
Juste une dernière petite question:
Les coordonnées que j'obtiens ainsi sont directement les coordonnées globale ou bien faut il que je "remonte" toute la pile des matrices? Parce que avant de dessiner l'objet qui m'intéresse j'ai beaucoup de PushMatrix.
Merci pour tes réponses et aussi pour tes phrases en français correct (c bcp plu lizibl ke ca).


---------------
deluser --remove-home ptitchep
n°1054205
ptitchep
Posté le 20-04-2005 à 20:15:26  profilanswer
 

Autre question: (et oui encore...)
Je suis un cancre en math et le peu de souvenirs que j'ai des opérations sur matrice, c'est que la multiplication d'un nombre par une matrice donne une autre matrice. Donc ta phrase:
"Une fois que tu as la matrice objet, il ne reste qu'a multiplier les points à coordonnées locales par cette matrice pour obtenir les coordonnées globales"
reste un mystère pour moi.


---------------
deluser --remove-home ptitchep
n°1054609
ptitchep
Posté le 20-04-2005 à 23:58:17  profilanswer
 

J'ai oublié de faire les efforts et j'ai posé mes questions trop tôt.
 
J'ai (enfin) obtenu mes coordonnées x y et z.
Mais (et oui) ces coordonnées dépendent toujours de la caméra.  
Si dans ma fonction d'affichage j'ai:
glLoadIdentity();
glTranslatef(x,y,z);
point(0,0,0);  //admettons que point() dessine un point
Tout marche bien.
 
Mais si j'intercale mon gluLookAt() alors rien ne va plus et si j'ose placer un glRotatef() avant le glTranslatef() c'est la catastrophe.
Je suppose donc que ces coordonnées dépendent de mon gluLookAt() et qu'il est possible d'en obtenir des fixes (même si je bouge la caméra)
 


---------------
deluser --remove-home ptitchep
n°1054664
retrox
Posté le 21-04-2005 à 00:22:12  profilanswer
 

Alors dans l'ordre :  
 
Non pas besoin de "remonter" la pile. Une matrice peut contenir un nombre de transformations arbitraire.
 
Pour la mutliplication d'un vecteur par une matrice, je te laisse chercher sur google (apparament tu as trouvé :)).
 
gluLookAt définit la matrice caméra. Sous OpenGL, tu l'utilises sur la matrice MODELVIEW, ce qui est normal. Seulement apres, lorsque tu rajoutes par dessus tes translate/rotate/scale, tu as une matrice mélangée MODELVIEW, et donc pas uniquement la partie objet. Donc c'est pas ce qu'il te faut. Ce que je te proposais c'est d'utiliser betement OpenGL pour fabriquer ta matrice :

Code :
  1. float mat[16];
  2. glPushMatrix();
  3. glLoadIdentity();
  4. glTranslatef(x,y,z);
  5. ...
  6. ...
  7. glGetFloatv(GL_MODELVIEW_MATRIX, mat);
  8. glPopMatrix();

Avec ça tu as récupéré ta matrice objet correspondant aux transformations que tu souhaites appliquer. Pour éviter de refaire les memes translate/rotate/scale, tu peux réutiliser cette matrice en la multipliant avec la matrice MODELVIEW (qui pour le moment ne doit contenir que la partie VIEW), et ceci en utilisant MultMatrix.
 
Une derniere chose : n'oublies pas que les transformations se produisent dans l'ordre inverse de celui qu'on écrit. Si tu écris glRotate puis glTranslate, c'est la translation qui est effectuée en premier.

n°1055150
ptitchep
Posté le 21-04-2005 à 14:08:20  profilanswer
 

Citation :

Une derniere chose : n'oublies pas que les transformations se produisent dans l'ordre inverse de celui qu'on écrit. Si tu écris glRotate puis glTranslate, c'est la translation qui est effectuée en premier.


 :??: Pourtant il me semblait que ça se passait bien dans l'ordre écrit puisqu'une rotation puis une translation va faire tourner l'objet puis effectuer la translation selon le nouveau repère non?
 
Bon merci je vais digérer tout ça... :sleep:


---------------
deluser --remove-home ptitchep
n°1056929
ptitchep
Posté le 22-04-2005 à 16:48:07  profilanswer
 

Ca y est j'ai enfin réussi. :sol:  
Je te remercie beaucoup parce que je pense que j'ai fait un graaand pas en avant ces jours-ci, même si des fois c'est pas facile :pt1cable:  
 


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 22-04-2005 à 16:48:07  profilanswer
 

n°1057112
retrox
Posté le 22-04-2005 à 18:55:59  profilanswer
 

Content de t'avoir aidé :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  OpenGL: obtenir les coordonnées réelles

 

Sujets relatifs
Moteur 3D IrrLicht + OpenGL..[OpenGL - ARB] Fragment shader sur carte Ati Fire GL 9000 (IBM T40p)
obtenir mon adresse IP en PerlopenGL sous visual
[Résolu] Comment obtenir le résultat -opposé- d'un SELECT ?OpenGL Matrix Skinning
[OpenGL] faire un pacman...MESA (opengl)
Comment marche Occlusion Queries sur opengl avec mac os[OpenGl] Lumiere dans une piece
Plus de sujets relatifs à : OpenGL: obtenir les coordonnées réelles


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR