PDA

View Full Version : Trying to add fingers to a forarm



Jayuqo01
06-04-2004, 12:01 PM
HI,

I'm brand new with OpenGL. I'm trying to add a finger to a forearm using glPushMatrix and glPopMatrix but I can't get it working well. Can somebody help me? Here's my code so far. Actually...the arm was already made....I just have to add fingers.

#include <GL/glut.h>
#include <stdlib.h>

static int epaule = 20, coude = 20, doigt1 = 20, doigt2 = 20, doigt3 = 20;
GLfloat light_diffuse[] = {1.0, 1.0, 0.0, 0.0};/*Initialiser la couleur de la lumière*/
GLfloat light_position[] = {0.0, 0.0, 1.50, 1.0};/*Initialiser la position de la lumière*/
GLUquadricObj *qobj;

void init(void)
{
glClearColor (0.5, 0.5, 0.5, 0.0);
glShadeModel (GL_SMOOTH);
}

void display(void) /* Créer un arbre d'objets */
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);;
glPushMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glRotatef ((GLfloat) epaule, 0.0, 1.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);

glPushMatrix();
glScalef (2.0, 0.4, 0.40);
glEnable(GL_LIGHTING);
glutSolidCube (1.0);
glDisable(GL_LIGHTING);
glPopMatrix();

glPushMatrix();
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) coude, 1.0, 1.0, 0.0);
glTranslatef (0.70, 0.0, 0.0);
glScalef (2.0, 0.4, 0.4);
glEnable(GL_LIGHTING);
glutSolidCube (0.70);
glDisable(GL_LIGHTING);

glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) doigt1, 0.0, 1.0, 0.0);
glTranslatef (-0.5,0.5, 0.0);
glScalef (1.0, 1.0, 1.0);
glEnable(GL_LIGHTING);
glutSolidCube (0.30);
glDisable(GL_LIGHTING);
glPopMatrix();
/*
//Doigt #2
glPushMatrix();
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) doigt2, 1.0, 0.0, 1.0);
glTranslatef (1.70, 0.0, 0.0);
glScalef (3.0, 0.4, 0.4);
glEnable(GL_LIGHTING);
glutSolidCube (0.20);
glDisable(GL_LIGHTING);
glPopMatrix();

//Doigt #3
glPushMatrix();
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) doigt3, 1.0, 0.0, 1.0);
glTranslatef (1.70, -0.17, 0.0);
glScalef (3.0, 0.4, 0.4);
glEnable(GL_LIGHTING);
glutSolidCube (0.20);
glDisable(GL_LIGHTING);
glPopMatrix();*/

glPopMatrix();
glutSwapBuffers();
glFlush();
}

void reshape (int w, int h) /* Projection */
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(75.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0, 0.0, -7.0);
}

/*Transformations selon les commandes du clavier*/

void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 'e':

epaule = (epaule + 5) % 360;
glutPostRedisplay();
break;
case 'E':
epaule = (epaule - 5) % 360;
glutPostRedisplay();
break;
case 'c':
coude = (coude + 5) % 360;
glutPostRedisplay();
break;
case 'C':
coude = (coude - 5) % 360;
glutPostRedisplay();
break;
case 'x':
doigt1 = (doigt1 - 5) % 360;
glutPostRedisplay();
break;
case 'X':
doigt1 = (doigt1 + 5) % 360;
glutPostRedisplay();
break;
case 'y':
doigt2 = (doigt2- 5) % 360;
glutPostRedisplay();
break;
case 'Y':
doigt2 = (doigt2 + 5) % 360;
glutPostRedisplay();
break;
case 'z':
doigt3 = (doigt3 - 5) % 360;
glutPostRedisplay();
break;
case 'Z':
doigt3 = (doigt3 + 5) % 360;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Robot");
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); /*définir et activer la lumière 0*/
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}

06-06-2004, 10:09 PM
all i can say is be careful about the order of xforms. generally you want to call translate, rotate, scale, in that order.