Ejemplo de programa en OpenGl de brazo robotico.
En este ejemplo se muestra el codigo basico, que realize en mi aprendizage basico de openlgl con intenciones didacticas, sobre el render de imagenes (modo inmediato) y la posiscion y visualizacion de la camara, ademas de trasformaciones basicas en las matrices y control de eventos del teclado.
Muestra un pequeño brazo robotico de 3 grados de libertad controlado por 3 letras, invirtiendo su giro segun sea minuscula o mayuscula.
Contiene una esfera roja en cada union de las articualciones con la intencion de ayudar a nuestra vision a dar la profundidas de las figuras tridimencionales geometricas utilizadas.
Para su compilacion en Linux se utiliza el siguiente comando:
gcc robotArm.c -lGL -lGLU -lglut
File:robotArm.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
static int shoulder = 0, elbow = 0, base=0;
//angulos de las uniones (grados de libertad)
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
//rutina de render
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0); //Funciones para profundidad
glColor3f (1.0, 0.0, 0.0); //Color Rojo
glutSolidSphere(0.5, 10, 8);//Esfera de la base
glPushMatrix();
glRotatef ((GLfloat) base, 0.0, 1.0, 0.0); //Gira la base en Y
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0); //Gira el hombro en Z
glPushMatrix(); //Guadra el estado de la matriz anterior
glTranslatef (1.5, 0.0, 0.0); //Traslada la primer parte en X
glScalef (3.0, 1.0, 1.0); //Escala el cubo a un rectangulo
glColor3f (1.0, 1.0, 1.0); //Color Blanco
glutWireCube (1.0); //Cubo de 1 unidad de lado
glPopMatrix(); //Bota la matriz recuperando la posicion anterior
glTranslatef (3, 0.0, 0.0); //Mueve el punto central al final de la primer pieza
glColor3f (1.0, 0.0, 0.0); //Color rojo para la esfera
glutSolidSphere(0.5, 10, 8);//Esfera de radio 0.5
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0); //Angulo de la siguiente union
glPushMatrix(); //Guadra el estado de la matriz anterior
glTranslatef (1.5, 0.0, 0.0); //Ajusta la pieza al inicio de la union
glScalef (3.0, 1.0, 1.0); //Escala la matriz
glColor3f (1.0, 1.0, 1.0); //Color Blanco
glutWireCube (1.0); //Cubo
glPopMatrix(); //Bota la matriz recuperando la posicion anterior
glTranslatef (3, 0.0, 0.0); //Traslada el centro al final del brazo
glColor3f (1.0, 0.0, 0.0); //color Rojo
glutSolidSphere(0.5, 10, 8);//Ultima esfera
glPopMatrix(); //vuelve a la matriz original (identidad)
glutSwapBuffers(); //Intercambia los buffers
}
void reshape (int w, int h) //Funcion que adecua el render a la ventana
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (0.0, 7.0, 12.0, 0.0, 3.0, 0.0, 0.0, 1.0, 0.0);
//posicion de la camara, A donde apunta, vector superior
}
void keyboard (unsigned char key, int x, int y) //Control del teclado
{
switch (key) {
case 's':
shoulder = (shoulder + 5) % 360;
glutPostRedisplay();
break;
case 'S':
shoulder = (shoulder - 5) % 360;
glutPostRedisplay();
break;
case 'e':
elbow = (elbow + 5) % 360;
glutPostRedisplay();
break;
case 'E':
elbow = (elbow - 5) % 360;
glutPostRedisplay();
break;
case 'b':
base = (base + 5) % 360;
glutPostRedisplay();
break;
case 'B':
base = (base - 5) % 360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char** argv) //Funcion principal
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
Brazo Robotico OpenGl
About author: Unknown
Cress arugula peanut tigernut wattle seed kombu parsnip. Lotus root mung bean arugula tigernut horseradish endive yarrow gourd. Radicchio cress avocado garlic quandong collard greens.
Suscribirse a:
Enviar comentarios (Atom)
lo puedo corre en visualstudio 2012?
ResponderEliminarQuisiera saber como lo puedes adecuar a una maquina hecha con primitivas y materiales
ResponderEliminar