Sorry about the mass of code… Hope this is a clear example
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
static int shoulder =0, elbow = 0, finger1=0, finger2=0, finger3=0, finger4=0, finger5=0;
GLfloat diffuseMaterial[4] = {0.5, 0.5, 0.5, 1.0};
void init(void)
{
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {25.0};
GLfloat light_position0[] = {1.0, 1.0, 1.0, 0.0};
GLfloat light_position1[] = {-1.0, -1.0, -1.0, 0.0};
glClearColor(0.5, 0.5, 0.5, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);
glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_DEPTH_TEST);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void display(void)
{
GLfloat mat_ambient1[] = {1.0, 0.0, 0.0, 0.0};
GLfloat mat_ambient2[] = {1.0, 1.0, 0.0, 0.0};
GLfloat mat_ambient3[] = {0.0, 1.0, 0.0, 0.0};
GLfloat mat_ambient4[] = {0.0, 0.0, 1.0, 0.0};
GLfloat mat_ambient5[] = {0.0, 0.5, 0.5, 0.0};
GLfloat mat_ambient6[] = {0.5, 0.0, 0.5, 0.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-1.0, 0.0, 0.0);
glRotatef((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef(1.0, 0.0, 0.0);
glPushMatrix();
glScalef(2.0, 0.4, 1.0);
glColor3f(1, 0, 0);
glutSolidCube(1.0);
glPopMatrix();
glTranslatef(1.0, 0.0, 0.0);
glRotatef((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef(1.0, 0.0, 0.0);
glPushMatrix();
glScalef(2.0, 0.04, 1.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient1);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient1);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient1);
glColor3f(1.0, 0.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glTranslatef(1.0, 0.0, 0.0); /* finger 1 */
glPushMatrix();
glRotatef((GLfloat) finger1, 0.0, 0.0, 1.0);
glTranslatef(0.15, 0.0, 0.425);
glPushMatrix();
glScalef(0.3, 0.04, 0.175);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient2);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient2);
glColor3f(1.0, 1.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0.15, 0.0, 0.0);
glRotatef((GLfloat) finger1, 0.0, 0.0, 0.5);
glTranslatef(0.15, 0.0, 0.0);
glPushMatrix();
glScalef(0.28, 0.04, 0.175);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient2);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient2);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient2);
glColor3f(1.0, 1.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat) finger2, 0.0, 0.0, 1.0);
glTranslatef(0.2, 0.0, 0.21);
glPushMatrix();
glScalef(0.4, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient3);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient3);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient3);
glColor3f(0.0, 1.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0.2, 0.0, 0.0);
glRotatef((GLfloat) finger2, 0.0, 0.0, 0.5);
glTranslatef(0.2, 0.0, 0.0);
glPushMatrix();
glScalef(0.38, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient3);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient3);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient3);
glColor3f(0.0, 1.0, 0.0);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat) finger3, 0.0, 0.0, 1.0);
glTranslatef(0.3, 0.0, -0.0025);
glPushMatrix();
glScalef(0.6, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient4);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient4);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient4);
glColor3f(0.0, 0.0, 1.0);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0.3, 0.0, 0.0);
glRotatef((GLfloat) finger3, 0.0, 0.0, 0.5);
glTranslatef(0.3, 0.0, 0.0);
glPushMatrix();
glScalef(0.58, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient4);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient4);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient4);
glColor3f(0.0, 0.0, 1.0);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat) finger4, 0.0, 0.0, 1.0);
glTranslatef(0.2, 0.0, -0.215);
glPushMatrix();
glScalef(0.4, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient5);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient5);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient5);
glColor3f(0.0, 0.5, 0.5);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0.2, 0.0, 0.0);
glRotatef((GLfloat) finger4, 0.0, 0.0, 0.5);
glTranslatef(0.2, 0.0, 0.0);
glPushMatrix();
glScalef(0.38, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient5);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient5);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient5);
glColor3f(0.0, 0.5, 0.5);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat) finger5, 0.0, 0.0, 1.0);
glTranslatef(0.15, 0.0, -0.4275);
glPushMatrix();
glScalef(0.3, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient6);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient6);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient6);
glColor3f(0.5, 0.0, 0.5);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0.15, 0.0, 0.0);
glRotatef((GLfloat) finger5, 0.0, 0.0, 0.5);
glTranslatef(0.15, 0.0, 0.0);
glPushMatrix();
glScalef(0.28, 0.04, 0.15);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient6);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_ambient6);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient6);
glColor3f(0.5, 0.0, 0.5);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(100.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case ‘s’: /*s kewy rotates at shoulder */
shoulder = (shoulder+5) % 360;
glutPostRedisplay();
break;
case ‘S’:
shoulder = (shoulder-5) % 360;
glutPostRedisplay();
break;
case ‘e’: /*e key rotates at elbow */
elbow = (elbow+5) % 360;
glutPostRedisplay();
break;
case ‘E’:
elbow = (elbow-5) % 360;
glutPostRedisplay();
break;
case ‘1’: /*f key rotates at finger1 */
finger1 = (finger1+5) % 360;
glutPostRedisplay();
break;
case ‘!’:
finger1 = (finger1-5) % 360;
glutPostRedisplay();
break;
case ‘2’: /*f key rotates at finger2 */
finger2 = (finger2+5) % 360;
glutPostRedisplay();
break;
case ‘@’:
finger2 = (finger2-5) % 360;
glutPostRedisplay();
break;
case ‘3’: /*f key rotates at finger3 */
finger3 = (finger3+5) % 360;
glutPostRedisplay();
break;
case ‘#’:
finger3 = (finger3-5) % 360;
glutPostRedisplay();
break;
case ‘4’: /*f key rotates at finger4 */
finger4 = (finger4+5) % 360;
glutPostRedisplay();
break;
case ‘$’:
finger4 = (finger4-5) % 360;
glutPostRedisplay();
break;
case ‘5’: /*f key rotates at finger4 */
finger5 = (finger5+5) % 360;
glutPostRedisplay();
break;
case ‘%’:
finger5 = (finger5-5) % 360;
glutPostRedisplay();
break;
case ‘x’: /*f key rotates at finger4 */
glRotatef(5, 1.0, 0.0, 0.0);
glutPostRedisplay();
break;
case ‘X’:
glRotatef(-5, 1.0, 0.0, 0.0);
glutPostRedisplay();
break;
case ‘y’: /*f kefy rotates at finger4 */
glRotatef(5, 0.0, 1.0, 0.0);
glutPostRedisplay();
break;
case ‘Y’:
glRotatef(-5, 0.0, 1.0, 0.0);
glutPostRedisplay();
break;
case ‘z’: /*f key rotates at finger4 */
glRotatef(5, 0.0, 0.0, 1.0);
glutPostRedisplay();
break;
case ‘Z’:
glRotatef(-5, 0.0, 0.0, 1.0);
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 800);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}