Upcoming Events
Unite 2010
11/10 - 11/12 @ Montréal, Canada

GDC China
12/5 - 12/7 @ Shanghai, China

Asia Game Show 2010
12/24 - 12/27  

GDC 2011
2/28 - 3/4 @ San Francisco, CA

More events...
Quick Stats
96 people currently visiting GDNet.
2406 articles in the reference section.

Help us fight cancer!
Join SETI Team GDNet!
Link to us Events 4 Gamers
Intel sponsors gamedev.net search:

  Contents

 Introduction
 The Code

 Printable version

 


This is a simple example of object hierarchy. We can think of object hierarchy as a mode of representing a complex object composed of more simple ones related to each other. In this tutorial we'll learn two new GL commands: glPushMatrix() and glPopMatrix() to accomplish our goal, which is modeling a simple robot.

The robot structure

Fig. 1a - Object Hierarchy 1b - GL model 1c - GL light model

Note the relationships between objects: Leg is pelvis child and pelvis is bust's child, forearm is arm's child and arm is shoulder's child, shoulder is bust's child too, and so on. So, if we move bust for example, legs and arms move too. This is an object hierarchy.

Every piece of the robot is modeled into a function and stored in a display list so we'll have:

void struct_part_name(void) { glNewList(part_name,GL_COMPILE); .../* GL Commands to model */ glEndList(); }

So, for example here is the code for left arm:

void struct_left_arm(void) { glNewList(left_arm,GL_COMPILE); // Shoulder glTranslatef(1.1,0.25,0.0); glScalef(0.5,0.5,0.5); glColor3ub(128,128,128); glutSolidSphere(0.5,20,20); // Arm glTranslatef(0.0,-1.10,0.0); glScalef(0.5,1.5,0.5); glColor3ub(255,255,255); glutSolidCube(1.0); glEndList(); }

Note that in this example I'll use some GLUT commands to draw Spheres and Cubes so remember to link gl/glut.h in the headers section as indicated below

... #include <gl/glut.h> ...

The most important function is DrawRobot() that draws all the parts of the robot and which uses the OpenGL commands glPushMatrix() and glPopMatrix() to estabilish the relationships between objects.

Pseudocode

void DrawRobot()
{
  glPushMatrix(); /* all objects are bust's son, that is if
                     we move bust all other parts move too */  
      
    /*------------------- DRAW HEAD AND BUST -------------------*/
    glPushMatrix();
      /* Draw head */
      /* Draw bust */
    glPopMatrix();
    
    /*---------------- DRAW RIGHT ARM AND FOREARM --------------*/
    glPushMatrix();
      glPushMatrix();
        /* Draw Right arm */
      glPopMatrix();

      glPushMatrix();  /* forearm is arm's child */
        /* Draw Forearm */
      glPopMatrix();
    glPopMatrix();
    
    /*-------------- DRAW LEFT ARM AND FOREARM -----------------*/
    glPushMatrix();
      glPushMatrix();
        /* Draw Left arm */
      glPopMatrix();

      glPushMatrix();  /* forearm is arm's child */
        /* Draw Forearm */
      glPopMatrix();
    glPopMatrix();
    
    /*------------------ DRAW PELVIS AND LEGS ------------------*/
    glPushMatrix();  /* another glPushMatrix because
                        if we move pelvis the legs move too...
                        (legs are pelvis' son) */
      glPushMatrix();
        /* Draw pelvis */
      glPopMatrix();
        
      glPushMatrix();
        glPushMatrix();
          /* Draw Right thigh */
        glPopMatrix();
      
        glPushMatrix();  /* leg is thigh's child */
          /* Draw Leg */
        glPopMatrix();
      glPopMatrix();
    
      glPushMatrix();
        glPushMatrix();
          /* Draw Left thigh */
        glPopMatrix();
      
        glPushMatrix();  /* leg is thigh's child */
          /* Draw Leg */
        glPopMatrix();
      glPopMatrix();

    glPopMatrix();

  glPopMatrix();
}
    



Next : The Code