Pushmatrix / popmatrix [Résolu]

mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention - 26 juil. 2005 à 16:54 - Dernière réponse : mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention
- 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="">
Afficher la suite 

8 réponses

Répondre au sujet
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 28 juil. 2005 à 09:36
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BunoCS
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 26 juil. 2005 à 17:01
0
Utile
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...
Commenter la réponse de BunoCS
mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention - 26 juil. 2005 à 18:51
0
Utile
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="">
Commenter la réponse de mondrone
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 27 juil. 2005 à 13:39
0
Utile
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...
Commenter la réponse de BunoCS
mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention - 27 juil. 2005 à 13:49
0
Utile
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="">
Commenter la réponse de mondrone
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 27 juil. 2005 à 14:04
0
Utile
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...
Commenter la réponse de BunoCS
mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention - 27 juil. 2005 à 18:27
0
Utile
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="">
Commenter la réponse de mondrone
mondrone 246 Messages postés mercredi 5 janvier 2005Date d'inscription 11 mars 2012 Dernière intervention - 28 juil. 2005 à 11:43
0
Utile
Ca l'est merci beaucoup pour ta patience.

Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.