viernes, 28 de febrero de 2014

Figuras con alambres y solidas

En esta ocasión dibujaremos algunas figuras como conos, esferas, etc. como si estubieran hechas por alambres y una dónde la figura sea sólida, lo haremos mediante las funciones glutWireSphere, glutWireCone, glutWireTorus, glutSolidSphere. 



#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <iostream>
#endif

#include <stdlib.h>

using namespace std;
//La función que nos va estar dibujando
void Dibuja(){
    cerr << "Dibuja()\n";
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    /*GL_PROJECTION permite mover el punto de referencia (0,0,0) a donde se le indique*/
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glPushMatrix();//guarda el estado de la matriz, es decir guardará lo
                    //se dibuje hasta antes del PopMatrix
    glTranslatef(-0.5,0.5,0.0);//permite mover el punto de origen de nuestro espacio en (x,y,z)
    glScalef(1.2,1.2,1.2);//permite esblecer  una escala
    glRotatef(45,0,1,1);//permite rotar el angulo según el eje que define el vector (x,y,z)
    glColor3f(0.0,1.0,0.0);//se establece el color para la figura a dibujar
    //glutSolidSphere(0.2,15,15); //dibuja la esfera solida
    glutWireSphere(0.2,15,15);//permite dibujar una esfera definiendo (radio,rebanadas en x,rebanadas en y)
    glPopMatrix();//la guarda y la restaura

    glPushMatrix();
    glTranslatef(0.0,0.7,0.0);
    glRotatef(60,1,0,0);
    //glRotated(1,0,0,1);
    glColor3f(1.0,1.0,0.0);
    //glutSolidCone(1,1,slices,stacks);//dibuja un cono solido
    glutWireCone(0.2,0.5,22.0,5.0);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(0.59,0.5,0.0);
    glRotatef(63,1,0,0);
    glColor3f(0.0,1.0,1.0);
    //glutSolidTorus(0.2,0.8,slices,stacks);
    glutWireTorus(0.05,0.3,12.0,32.0);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-0.4,-0.4,0.0);
    glRotatef(55,9,22,0);
    glColor3f(0.2,0.3,0.5);
    //glutWireCone(1,1,slices,stacks);//dibuja un cono sin relleno
    glutWireCube(0.4);
    glPopMatrix();

    glPushMatrix();//guarda la matriz
    glTranslatef(0.4,-0.4,0.0);
    glScalef(1.2,1.2,1.2);//permite esblecer  una escala
    glRotatef(45,0,1,1);
    glColor3f(0.5,0.0,0.5);
    glutSolidSphere(0.2,40,22); //dibuja la esfera solida
    //glutWireSphere(0.2,15,15);
    glPopMatrix();//la guarda y la restaura

    glFlush();
}

int main(){
    cerr <<"main() \n";
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(700,700);
    glutCreateWindow("");
    glutDisplayFunc(Dibuja);
    glutMainLoop();
}

lunes, 17 de febrero de 2014

Programas en CODE BLOCKS utilizando OpenGL

Este código es el que muestra el SW Code Blocks como de prueba para observar distintas funciones que se pueden realizar en OpenGL.



/*
 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */
//librerias
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
#include <stdlib.h>
//Variables globales
static int slices = 16;/*  */
static int stacks = 16;//

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION); //Activar la matriz de proyeccion
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);//Definición del volumen de visualizacion
    //la matriz de transformacion debe entenderse como una pila
    glMatrixMode(GL_MODELVIEW);//activar matriz de trasformación
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    //aplicar transformaciones a una pequeña parte de la geometria
    glPushMatrix();//se guarda el estado actual de la matriz
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(-2.4,1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        //dibuja la esfera en los puntos que se desea
        glutSolidSphere(1,slices,stacks);//Dibuja la esfera solida
    glPopMatrix();//se recupera el estado actual de la matriz

    glPushMatrix();
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(0,1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);//dibuja un cono solido
    glPopMatrix();

    glPushMatrix();
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(2.4,1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(-2.4,-1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);//dibuja una esfera sin relleno
    glPopMatrix();

    glPushMatrix();
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(0,-1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);//dibuja un cono sin relleno
    glPopMatrix();

    glPushMatrix();
        //Funcion que nos traslada posiX unidades en el ejeX
        //posiY en el eje Y
        glTranslated(2.4,-1.2,-6);
        //Rotar el angulo segn el eje que define el vector(vx,vy,vz)
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);//dibuja una dona sin relleno
    glPopMatrix();

    glutSwapBuffers();
}

//metodo que controla la animación del movimiento de las figuras
static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//recoger los parametros de la linea de comandos
    glutInitWindowSize(640,480);//define tamaño de la ventana ancho y alto
    //colocar la ventana en un punto determinador de la pantalla, origenx,origeny
    glutInitWindowPosition(10,10);
    //le dice al motor grafico que hay que renderizar, refrescar
    //o no la pantalla, que buffer hay que activar o desactivar y
    //la modalidad de colores que queremos usar
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    //crear la ventana con un titulo<-se pasa a un array de caracteres
    glutCreateWindow("GLUT Shapes");

    ////manda llamar el metodo a ejecutar
    glutReshapeFunc(resize);
    //el sistema le dice al subsistema grafico cal es la funcion que
    //que debe llamarse cada vez que se requiera dibujar de nuevo en pantalla
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);


    glEnable(GL_LIGHT0);//activar o desactivar la luz 0
    glEnable(GL_NORMALIZE);//activa la normalizacion
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);//activar y desactivar todo el cálculo de iluminación

    //Colocar un foco en un lugar determinado
    //GL_LIGHT0, GL_LIGHT1, GL_LIGHT2
    //parametros RGBA rales, definien el porcentaje de intensidad
    //de cada color que tiene la luz.
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    //
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    //definimos que todas las caras principales
    //FRONT son las caras "que se ven" del poligono
    //los componentes dibujados ahora tendrán una componente difu
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    //Es entrar al bucle infinito que domina cualquier aplicacion
    //OpenGL y con la sig. funcion se le dice a la libreria que
    //espere eternamenta que se produzcan "eventos"
    glutMainLoop();

    return EXIT_SUCCESS;
}



Este es el primer código que eh realizado, consiste en dibujar puntos en un plano 2D. Cabe destacar el uso de la primitiva GL_POINTS.



//librerias
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
#include <stdlib.h>

/* GLUT callback Handlers */

static void display(void)
{

    //glClearColor(0,0,1,1);//color de pantalla
    glClear(GL_COLOR_BUFFER_BIT);//limpia la pantalla
    glPointSize(10);//Grosor del punto
    glColor3f(1,0.1,0.0);//color rojo (RGB) para los elementos dibujados dentro del glBegin()
    //GLBegin se utiliza para encapsular o escribir toda primitiva
    //GL_POINTS se utiliza para dibujar puntos individuales
    glBegin(GL_POINTS);
        //controla x
        for(double i=-1.0;i<1.0;i=i+0.1){
            //controla y
            for(double j=-1.0; j<1.0;j=j+0.1){
                glVertex2d(i,j);
            }
        }

    glEnd();//cierra glBegin()
    glFlush();//refuerzo de pintado
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//recoger los parametros de la linea de comandos
    //le dice al motor grafico que hay que renderizar, refrescar
    //o no la pantalla, que buffer hay que activar o desactivar y
    //la modalidad de colores que queremos usar
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(600,600);//establece el tamaño de la pantalla donde se mostrará nuestro dibujo o animacion
    glutInitWindowPosition(0,0);//establecen las coordenadas del lugar de la pantalla donde se quiere que aparezca la ventana
    glutCreateWindow("Dibuja Puntos");//Titulo de la Ventana
    glutDisplayFunc(display);//manda llamar el metodo a ejecutar
    //Es entrar al bucle infinito que domina cualquier aplicacion
    //OpenGL y con la sig. funcion se le dice a la libreria que
    //espere eternamenta que se produzcan "eventos"
    glutMainLoop();

}




Este segundo código muestra como dibujar una cuadricula en un plano 2D. Cabe resaltar ahora el uso de la primitiva GL_LINES_STRIP.


//librerias
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
#include <stdlib.h>

/* GLUT callback Handlers */

static void display(void)
{
    glClearColor(1.0,1.0,0.0,1.0);//color de pantalla
    glClear(GL_COLOR_BUFFER_BIT);//limpia la pantalla
    glLineWidth(7);//define el grosor de linea
    glColor3f(0.0,0.0,1.0);//color azul fuerte (RGB) para los elementos dibujados dentro del glBegin()
    //GLBegin se utiliza para encapsular o escribir toda primitiva
    //GL_LINE_STRIP permite trazar series de segmentos conectados
    glBegin(GL_LINE_STRIP);
        //primer for dibuja las lineas verticales
        //controla y
        double j=1.0;
        //controla x
        for(double i=-0.1;i<=1.0;i=i+0.1){
                glVertex2d(i,j);// dibuja un vertice en la coordenada (x,y)
                glVertex2d(i,-j);
                glVertex2d(-i,-j);
                glVertex2d(-i,j);
        }
        //segundo for dibuja las lineas horizontales
        //controla x
        double i=1.0;
            //controla y
            for(double j=-1.0;j<=1.0;j=j+0.1){
                glVertex2d(-i,j);// dibuja un vertice en la coordenada (x,y)
                glVertex2d(-i,-j);
                glVertex2d(i,-j);
                glVertex2d(-i,-j);
                //glColor3f(1.0,1.0,0.0);
                //glVertex2d(i,-j);

            }

    glEnd();//cierra glBegin()
    glFlush();//refuerzo de pintado

}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//recoger los parametros de la linea de comandos
    //le dice al motor grafico que hay que renderizar, refrescar
    //o no la pantalla, que buffer hay que activar o desactivar y
    //la modalidad de colores que queremos usar
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(600,600);//establece el tamaño de la pantalla donde se mostrará nuestro dibujo o animacion
    glutInitWindowPosition(50,50);//establecen las coordenadas del lugar de la pantalla donde se quiere que aparezca la ventana
    glutCreateWindow("Dibuja Cuadricula");//Titulo de la Ventana
    glutDisplayFunc(display);//manda llamar el metodo a ejecutar
    //Es entrar al bucle infinito que domina cualquier aplicacion
    //OpenGL y con la sig. funcion se le dice a la libreria que
    //espere eternamenta que se produzcan "eventos"
    glutMainLoop();

}



Este tercer código muestra como dibujar un cuadrado con cuadrados dibujados sobre él. Cabe resaltar ahora el uso de la primitiva GL_QUADS.



#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

#include <stdlib.h>

static void display(void)
{
    float a=1.0;
    //glClearColor(1.0,1.0,0.0,1.0);//color de pantalla
    glClear(GL_COLOR_BUFFER_BIT);//limpia la pantalla
    glPointSize(10);//Grosor del punto
    //GLBegin se utiliza para encapsular o escribir toda primitiva
    //GL_QUADS permite que cada cuadrupla de vertices determine un cuadrado
    glBegin(GL_QUADS);

    for(double i=1.0;i>=0.1;i=i-0.1){
        glColor3f(0.0,a,1.0);//color azul marino/cian(RGB) para los elementos dibujados dentro del glBegin()
        glVertex2d(-i,-i);
        glVertex2d(-i,i);
        glVertex2d(i,i);
        glVertex2d(i,-i);
        if(a==1.0){
            a=a-1;
        }else{
            a=a+1;
        }

    }
        /*Cuadrado
        glVertex2d(-0.1,-0.1);
        glVertex2d(-0.1,0.1);
        glVertex2d(0.1,0.1);
        glVertex2d(0.1,-0.1);*/

    glEnd();//cierra glBegin()
    glFlush();//refuerzo de pintado

}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//recoger los parametros de la linea de comandos
    //le dice al motor grafico que hay que renderizar, refrescar
    //o no la pantalla, que buffer hay que activar o desactivar y
    //la modalidad de colores que queremos usar
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(600,600);//establece el tamaño de la pantalla donde se mostrará nuestro dibujo o animacion
    glutInitWindowPosition(0,0);//establecen las coordenadas del lugar de la pantalla donde se quiere que aparezca la ventana
    glutCreateWindow("Dibuja Cuadrado");//Titulo de la Ventana
    glutDisplayFunc(display);//manda llamar el metodo a ejecutar
    //Es entrar al bucle infinito que domina cualquier aplicacion
    //OpenGL y con la sig. funcion se le dice a la libreria que
    //espere eternamenta que se produzcan "eventos"
    glutMainLoop();

}



Este cuarto código muestra como dibujar un triangulo con triangulo dibujados sobre él. Cabe resaltar ahora el uso de la primitiva GL_TRIANGLES.



#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif

#include <stdlib.h>

static void display(void)
{
    float a=1.0;
    //glClearColor(1.0,1.0,0.0,1.0);//color de pantalla
    glClear(GL_COLOR_BUFFER_BIT);//limpia la pantalla
    glPointSize(10);//Grosor del punto
    //GLBegin se utiliza para encapsular o escribir toda primitiva
    //GL_TRIANNGLES permite que cada terna de vertices determine un triangulo
    glBegin(GL_TRIANGLES);

    for(double i=1.0;i>=0.1;i=i-0.1){
        glColor3f(1.0,a,0.0);//color amarillo/rojo (RGB) para los elementos dibujados dentro del glBegin()
        glVertex2d(-i,-i);
        glVertex2d(0.0,i);
        glVertex2d(i,-i);
        if(a==1.0){
            a=a-1;
        }else{
            a=a+1;
        }

    }
        /*Triangulo
        glVertex2d(-0.1,-0.1);
        glVertex2d(0.0,0.1);
        glVertex2d(0.1,-0.1);*/


    glEnd();//cierra glBegin()
    glFlush();//refuerzo de pintado

}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);//recoger los parametros de la linea de comandos
    //le dice al motor grafico que hay que renderizar, refrescar
    //o no la pantalla, que buffer hay que activar o desactivar y
    //la modalidad de colores que queremos usar
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(600,600);//establece el tamaño de la pantalla donde se mostrará nuestro dibujo o animacion
    glutInitWindowPosition(0,0);//establecen las coordenadas del lugar de la pantalla donde se quiere que aparezca la ventana
    glutCreateWindow("Dibuja Cuadrado");//Titulo de la Ventana
    glutDisplayFunc(display);//manda llamar el metodo a ejecutar
    //Es entrar al bucle infinito que domina cualquier aplicacion
    //OpenGL y con la sig. funcion se le dice a la libreria que
    //espere eternamenta que se produzcan "eventos"
    glutMainLoop();
}









OpenGL vs DirectX

En esta ocasión abordaremos el tema de API's para graficacion exponiendo sus principales elementos, en especial de OpenGL y DirectX, quienes son los principales competidores en la actualidad.

http://prezi.com/zxvvsam8szru/elementos-de-sw-api/?utm_campaign=share&utm_medium=copy

Presentación en Power Point de las distintas Aplicaciones gráficas por computadora

Algunos de los campos en los que la graficacion se aplica e incluso auxilia a distintas ciencias para el estudio de ciertos fenómenos

https://drive.google.com/file/d/0B_kQ4HQbKN6KZDdWWHZyMkVMZEk/edit?usp=sharing