OpenGL has a very clever mechanism. It's able to store the current state of the environment, draw something, and then return to the previous state. What we want to do is basically save the position of the first glTranslate $(0,0,-3)$, add the glTranslate $(0,0,-1)$ method, draw the cube, and then take away the last glTranslate (). We do it by modifying the update method in Object to the following:
def update (self) :
glPushMatrix ()
for $c$ in self.components:
if isinstance(c, Transform) :
pos $=c \cdot$ get_position()
glTranslatef (pos.x, pos.y, pos.z)
if isinstance (c, Mesh3D) :
c. draw ()
glPopMatrix()
In short, think of glPushMatrix () as fixing the graphics environment with respect to transformations (including a translate). This causes OpenGL to remember the current state of the environment. When glPopMatrix () is called, OpenGL returns to the last remembered state of the environment. Don't worry too much about the technical details that are going on in the background at this time, as we will cover them in detail in later chapters.