mondrone
Messages postés246Date d'inscriptionmercredi 5 janvier 2005StatutMembreDernière intervention11 mars 2012
-
26 juil. 2005 à 16:54
mondrone
Messages postés246Date d'inscriptionmercredi 5 janvier 2005StatutMembreDernière intervention11 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 !
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 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 à lorigine 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...
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 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...
mondrone
Messages postés246Date d'inscriptionmercredi 5 janvier 2005StatutMembreDernière intervention11 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 ?
mondrone
Messages postés246Date d'inscriptionmercredi 5 janvier 2005StatutMembreDernière intervention11 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é" ?