Pushmatrix / popmatrix

Résolu
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 26 juil. 2005 à 16:54
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012 - 28 juil. 2005 à 11:43
En fait ca fait un moi que je prog en opengl (c peu je sais) et
j'utilisais un peu les fonctions sans les comprendre parce que sur le
coup ca fait beaucoup a ingurgiter, et donc de tps en tps je me plonge
dans une partie du code "sample" pour en comprendre un bout et essayer
d'avancer, ou alors je décortique des tutos sur le net, et là : je me
demandais exactement comment marche glpopmatrix, car si ca remplace la
matrix existante par celle du stack directement, je vois pas pourquoi
on fait des calculs entre push et pop. Dans ce cas les calculs seraient
perdus genre le scale qu'on a fait spécialement je vois pas pkoi il est
conservé puisque la matrice est écrasée. Quelqu'un pourrait-il
m'expliquer un peu please ? Merci d'avance !

Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">

8 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
28 juil. 2005 à 09:36
Il faut savoir qu'à chaque fois que tu appelle une fonction telle que
glTranslate, glRotate, glScale,... tu fais en fait une multiplication
de matrices: tu multiplie ta matrice de déplacement avec la matrice
courante. D'où le pushMatrix pour sauvegarder "d'où tu viens". Je pense
que je ne suis pas assez clair, je vais essayer de t'illustrer la pile
de matrice de transformation sur un exemple simple.





Exemple, une voiture, 4 roues et 5 boulons par roue :

1. dessin de la voiture (repère R0)

2. mémorisation de son origine

3. translation relative appropriée pour placer la première roue

4. mémorisation de la position courante (repère R1)

5. 5 translations puis rotations pour les 5 boulons (repère R2)

6. suppression de la translation pour revenir à l’origine de la voiture

7. translation relative appropriée pour placer la deuxième roue

. . .



Le mécanisme de pile permet la mémorisation de la position courante
(glPushMatrix) et le retour à la position précédente (glPopMatrix).
Exemple :

void Roue_Boulons()

{

Roue();

for (int i = 0 ; i < 5 ; i++) {

glPushMatrix();

glRotatef(degre*i, 0, 0, 1); // autour de Z

glTranslatef(Xb, 0, 0);

Boulon(); // ATTENTION : R*T*Boulon()

glPopMatrix();

}

}



void Quatre_Roues()

{

glPushMatrix();

glTranslatef(Xr1, 0, Zr1);

Roue_Boulons();

glPopMatrix();

glPushMatrix();

glTranslatef(Xr1, 0, Zr2);

Roue_Boulons();

glPopMatrix();

...

}


La pile de transformation:



|
| |
| |
| |
| | |

|
| |
| |
| |
| | |

|
| |
| |
| | R1| |
R2|

|
| | R0| |
R1| | R1| |
R1|

| R0| |
R0| | R0| |
R0| | R0|

|____| |___|
|___| |___| |___|


1
2
3
4 5



En espérant que cela te soit plus clair maintenant...


Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
26 juil. 2005 à 17:01
Si je ne me trompe pas, glPushMatrix() recopie le sommet de pile. Comme
ça, tu peux faire tous les calculs que tu veux, tu as sauvegarder ton
contexte, que tu retrouve avec glPopMatrix()

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
26 juil. 2005 à 18:51
oui, d'après la description c ca !

Mais suivant ce raisonnement,



glPushMatrix();

glTranslatef(x,y,0);

glScalef(0.005F,0.005F,0.005F);

for ( p = buffer ; *p ; p++ )

glutStrokeCharacter(GLUT_STROKE_ROMAN,*p);

glPopMatrix();



La fonction glutStrokeCharacter ne sert a rien ici non ? Car il s'agit là d'un bout de code provenant d'un exemple d'écriture en opengl. Non testé.


Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
27 juil. 2005 à 13:39
Bah...euh... la fonction sert à quelquechose: elle sert à écrire du texte...je ne comprend pas trop la question.



Voici ce que le code fait:

(- dessine des trucs) avant le code

- sauvegarde du contexte

- déplacement vers la position souhaitée et changement d'échelle

- affichage de la chaine de caractères

- récupération du contexte

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
27 juil. 2005 à 13:49
Ce que je pige pas, c que quand tu récupère ton contexte, tu écrase
bien la matrice sur laquelle tu viens de travailler ? Dans ce cas tu
devrais perdre le travail effectué non ?

Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
27 juil. 2005 à 14:04
Ah bah non! C'est justement là l'intérêt! Tu utilise PushMatrix()/PopMatrix() pour ne pas foutre la zone dans le reste du rendu.



Imagine, tu veux dessiner un humanoïde: tu as juste accès au centre de gravité pour le déplacer.

Eh ben, dans la classe humanoïde, tu as une fonction qui doit faire ceci:

- push + déplacement vers centre tronc

- dessine le tronc

- push + déplacement vers centre bras gauche

- dessine bras gauche

- pop = retour au repère du tronc

- push + déplacement vers centre bras droit

- pop = retour au repère du tronc

...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
27 juil. 2005 à 18:27
Ce qui veux dire que toutes les infos de scale translate et toutes les
opérations du genre ne sont pas enregistrées dans la matrice ? Ou en
tout cas pas seulement dedans, et que par conséquent quand je pop, le
déplacement est toujours effectué mais n'est seulement plus "dessiné" ?

Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
28 juil. 2005 à 11:43
Ca l'est merci beaucoup pour ta patience.

Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
0
Rejoignez-nous