OpenGL: obtenir les coordonnées réelles - C++ - Programmation
Marsh Posté le 20-04-2005 à 14:08:11
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
Marsh Posté le 20-04-2005 à 17:16:02
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.
Marsh Posté le 20-04-2005 à 18:48:28
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).
Marsh Posté le 20-04-2005 à 20:15:26
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.
Marsh Posté le 20-04-2005 à 23:58:17
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)
Marsh Posté le 21-04-2005 à 00:22:12
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 :
|
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.
Marsh Posté le 21-04-2005 à 14:08:20
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...
Marsh Posté le 22-04-2005 à 16:48:07
Ca y est j'ai enfin réussi.
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
Marsh Posté le 19-04-2005 à 12:21:18
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