La compréhension glPushMatrix() et glPopMatrix()
J'ai le code suivant:
void drawObj1(){
glPushMatrix();
glTranslatef(rBaseInitPos + (rBaseDim[0] /2), rBaseDim[1] + baseIncrement + rBaseDim[1] /2, rBaseDim[2] /2);
glRotatef(rBaseArmRotateAngle, 0, 1, 0);
/*
glPushMatrix();
*/
drawRobotBaseArm();
/*
glPopMatrix();
*/
glPushMatrix();
glRotatef(90, 1, 0, 0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, rCamouflage[0]);
gluQuadricTexture(obj, GL_TRUE);
gluQuadricDrawStyle(obj, GLU_FILL);
gluDisk(obj, 0, (rBaseDim[0] /2) - 0.5, 16, 4);
gluCylinder(obj, (rBaseDim[0] /2) - 0.5, (rBaseDim[0] /2) - 0.5, rBaseDim[1] /2, 16, 4);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glPopMatrix();
}
void drawScene(){
glTranslatef(X, Y, Z);
drawObj0();
drawObj1();
}
Avec le code ci-dessus, puisqu'il y a une traduction à l'intérieur de drawRobotBaseArm();
à la fois la Disk
et la Cylinder
sont également traduits. Depuis je n'en veux pas, j'ai dé-commenter le code en haut et en bas de drawRobotBaseArm();
Ce faisant, le code suivant:
glTranslatef(rBaseInitPos + (rBaseDim[0] /2), rBaseDim[1] + baseIncrement + rBaseDim[1] /2, rBaseDim[2] /2);
glRotatef(rBaseArmRotateAngle, 0, 1, 0);
N'agit que sur drawRobotBaseArm();
et maintenant, le Disk
et la Cylinder
ne sont pas traduits et mis en rotation.
Je n'arrive pas à comprendre comment glPushMatrix()
et glPopMatrix()
travail. Une idée de comment puis-je obtenir ce que je cherche?
OriginalL'auteur Favolas | 2014-05-31
Vous devez vous connecter pour publier un commentaire.
(À noter que ces fonctions sont obsolètes, et retiré en OpenGL 3.1+. Envisager de passer à une bibliothèque de mathématiques comme GLM si vous travaillez sur un projet sérieux.)
OpenGL garde un pile de matrices pour appliquer rapidement et de supprimer les transformations.
glPushMatrix
copies le haut de la matrice et le pousse sur la pile, tandis queglPopMatrix
pop le haut de la matrice en dehors de la pile. Toutes les fonctions de transformation (glScaled
, etc.) fonction sur le haut de la matrice, et la partie supérieure de la matrice est ce que toutes les commandes de rendu utiliser pour transformer leurs données.En poussant et en sautant des matrices, vous pouvez contrôler les transformations à appliquer aux objets, ainsi que d'appliquer des transformations à des groupes d'objets, et facilement inverser les transformations de sorte qu'elles n'affectent pas les autres objets.
Un exemple:
Dans votre exemple, faire
glPush/PopMatrix
autour dedrawRobotBaseArm
signifie que les transformations effectuées pardrawRobotBaseArm
sont inversés après il a appelé, afin de ne pas affecter les autres objets.drawRobotBaseArm
n'est pas appliquée à d'autres objets. Donc, comme vous l'avez expliqué, je suis correct quand entourant cette fonction avec lespush/pop
. Le problème est que la translation et la rotation sur le haut de la fonction (pas la traduction à l'intérieur dedrawRobotBaseArm
) doit aussi être appliqué à cylindre et le disque, mais dans ce cas, il n'est pas. Est seulement appliqué àdrawRobotBaseArm
OriginalL'auteur Colonel Thirty Two