Jump to content
  • Advertisement
  • 12/28/00 09:51 AM
    Sign in to follow this  

    OpenGL Object Hierarchy

    Graphics and GPU Programming

    Myopic Rhino


    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: [font="Courier New"][color="#000080"]glPushMatrix()[/color][/font] and [font="Courier New"][color="#000080"]glPopMatrix()[/color][/font] to accomplish our goal, which is modeling a simple robot. [size="5"]The robot structure [table][tr][td]struct_.gif[/td][td]struct0.jpg[/td][td]struct.jpg[/td][/tr][tr][td]Fig. 1a - Object Hierarchy[/td][td]1b - GL model[/td][td]1c - GL light model[/td][/tr][/table] 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 ...
    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. [size="5"]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();[attachment=3301:head&bust.jpg]
    /*---------------- DRAW RIGHT ARM AND FOREARM --------------*/ glPushMatrix(); glPushMatrix(); /* Draw Right arm */ glPopMatrix(); glPushMatrix(); /* forearm is arm's child */ /* Draw Forearm */ glPopMatrix(); glPopMatrix();[attachment=3302:arm&forearm.jpg]
    /*-------------- DRAW LEFT ARM AND FOREARM -----------------*/ glPushMatrix(); glPushMatrix(); /* Draw Left arm */ glPopMatrix(); glPushMatrix(); /* forearm is arm's child */ /* Draw Forearm */ glPopMatrix(); glPopMatrix();[attachment=3303:arm&forearml.jpg]
    /*------------------ 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(); }[attachment=3304:pelvis&legs.jpg]
    [size="5"]The Code
    void DrawRobot(void) { /*-------------BUST AND HEAD--------------*/ glPushMatrix(); glRotatef(bust_angle_y,0,1,0); glRotatef(bust_angle_x,1,0,0); glPushMatrix(); glCallList(bust); glCallList(head); glPopMatrix(); /*--------RIGHT ARM AND FOREARM---------*/ glPushMatrix(); glTranslatef(0,0.25,0); glRotatef(right_arm_angle,1,0,0); glTranslatef(0,-0.25,0); glPushMatrix(); glCallList(right_arm); glPopMatrix(); glPushMatrix(); glTranslatef(1.25,-0.7,0); glRotatef(right_forearm_angle,1,0,0); glTranslatef(-1.25,0.7,0); glCallList(right_forearm); glPopMatrix(); glPopMatrix(); /*---------LEFT ARM AND FOREARM---------*/ glPushMatrix(); glTranslatef(0,0.25,0); glRotatef(left_arm_angle,1,0,0); glTranslatef(0,-0.25,0); glPushMatrix(); glCallList(left_arm); glPopMatrix(); glPushMatrix(); glTranslatef(1.25,-0.7,0); glRotatef(left_forearm_angle,1,0,0); glTranslatef(-1.25,0.7,0); glCallList(left_forearm); glPopMatrix(); glPopMatrix();
    and so on... In the main function I added some keys to control the robot. They are:
    '1' & 'Q'
    '2' & 'W'
    '3' & 'E'
    '4' & 'R'
    '5' & 'T'
    '6' & 'Y'
    '7' & 'U'
    '8' & 'I'
    'V' 'B' 'N' 'M'
    right arm control
    right forearm control
    left arm control
    left forearm control
    left thigh control
    left leg control
    right thigh control
    right thigh control
    rotate model
    light control
    camera control
    And finally the bin & source are attached to this article. Happy coding... Arturo "IRIX" Montieri : [email="montieri@hotmail.com"]montieri@hotmail.com[/email]

      Report Article
    Sign in to follow this  

    User Feedback

    This program can not run on my computer, please help on this error problem

    Share this comment

    Link to comment
    Share on other sites

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!