Este tutorial aborda la creación una aplicación simple en OpenGL de dos formas diferentes, a través de las librerías aux y glut. Como ejemplos estilo “Hola Mundo” están orientadas a mostrar en pantalla aplicaciones simples que introduzcan al uso de una tecnología nueva para alguien, en este caso OpenGL, por esto mismo no se explican en profundidad, extensión o detalle todos los conceptos relacionados con el código fuente.

Los dos programas fueron probados en el Visual Studio .net 2003, pero es de esperar que funcionen en versiones anteriores (2002, 6) y en entornos diferentes (devcpp). En otros lenguajes como Java o c#, el código variará dependiendo de la sintaxis del lenguaje, la forma en que se realice el binding (ligadura) con el API (OpenGL esta escrito orientado al lenguaje c) y el sistema operativo.

Primera Aplicación 3d Usando AUX

En los comienzos de OpenGL aux (de auxiliar) se creo como una librería para ayudar a los programadores a entender el uso del API, hacer ejemplos y prototipos de manera rápida sin tener que preocuparse por las particularidades del sistema operativo. Actualmente aux esta descontinuada, no es mantenida y en la página oficial de OpenGL no se recomienda utilizarla, pero está en este tutorial de manera ilustrativa.

C++:
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <gl\gl.h>
  4. #include <gl\glu.h>
  5. #include <gl\glaux.h>
  6.  
  7. #pragma comment(lib, "opengl32.lib")
  8. #pragma comment(lib, "GlAux.Lib")
  9. #pragma comment(lib, "glu32.lib")
  10.  
  11. void main(void)
  12. {
  13.         auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
  14.     auxInitPosition(100,100,640,480);
  15.     auxInitWindow("Hola Mundo 3d");
  16.     glViewport(0,0,640,480);                       
  17.     gluPerspective(45.0f,640.0f /480.0f, 1.0 ,150.0f);
  18.     glTranslatef(0,0,-15.0f);
  19.     auxWireTeapot(4.0f);
  20.     glFlush();
  21.     getchar();
  22. }

Con estas 9 líneas de código (sin contar las inclusiones y la declaración del main) se muestra una consola y una ventana con una tetera dibujada en alambres, para cerrar la ventana es necesario introducir una enter en la consola.

Programa AUX

Las primeras 5 líneas de código son las inclusiones de las liberáis que necesita el programa, son windows.h , requeridas por OpenGL, stdio.h para la función getchar() y las de OpenGL gl.h, glut.h y glaux.h. Todas estas librerías vienen en la distribución de Visual C++, por lo que no hay que preocuparse de su ubicación en el disco duro.

Las siguientes 3 líneas son las directivas #pragma comment(lib, "...") sirven para ligar las librerías binarias de OpenGL, ya que las .h solo contienen los prototipos de las funciones que se utilizarán. Al igual que las cabeceras .h, estas vienen en la distribución de Visual c++.

La siguiente línea es la declaración de la función main(), que identifica al programa como de tipo consola. Es importante elegir este tipo de plantilla al crear el proyecto, ya que de otra manera la configuración del compilador no será la adecuada para que el programa se compile y ejecute.

Finalmente llegamos a las líneas que constituyen propiamente el programa

  • auxInitDisplayMode(AUX_SINGLE | AUX_RGBA) : Esta función realiza dos inicializaciones el área de dibujo de la ventana, la primera “AUX_SINGLE”, indica un buffer sencillo, la segunda “AUX_RGBA” indica el modo de colores deseado, es decir los canales, Red (Rojo) – Green (Verde) – Blue (Azul) – Alpha (Transparencia).
  • auxInitPosition(100,100,640,480): los dos primeros valores indican la posición de la ventana cuando se muestre y los dos últimos indican el tamaño de la ventana. Asi que esta linea configura una pantalla que se muestra en (100,100) contados desde la esquina superior izquierda de la pantalla (x + derecha, y + abajo) y de tamaño 640x480.
  • auxInitWindow("Hola Mundo 3d”): inicializa el título de la ventana, que es el que aparece en la barra superior de esta, en este caso es “Hola Mundo 3d”.
  • glViewport(0,0,640,480): Inicializa el rectángulo sobre el que se va a dibujar en la ventana, los parámetros son posición (x,y) contados a partir de la esquina inferior izquierda (x + derecha, y + arriba) y las dimensiones ancho – alto. En este caso el recuadro de dibujo empieza en (0,0) y tiene dimensiones 640x480 (el tamaño completo de la ventana)
  • gluPerspective(45.0f,640.0f /480.0f, 1.0f ,150.0f) Define el frustrum. Los parámetros son el ángulo de visión (45.0), el aspecto que es el ancho de la ventana dividido el alto (640.0f/480.0) y la distancia mas cercana (1.0) y lejana (150.0) dentro de la cual pueden estar los objetos antes de ser recortados. Si parte de un objeto está recortado, es parte no se dibuja.
  • glTranslatef(0,0,-15.0f): Sirve para trasladar el objeto los objetos (la tetera) una distancia (x,y,z) a partir de donde están, en este caso (0,0,-15.0f) a partir del origen.
  • auxWireTeapot(4.0f): Dibuja una tetera de tamaño 4.0 en la posición actual (0,0,-15.0)
  • glFlush(): Obliga a los comandos pendientes de OpenGL a ejecutarse, en este caso, mueve y dibuja la tetera.
  • getchar(): Esta línea está por facilidad. De no estar incluida, la ventana aparecería y desaparecería (cuando se terminen de ejecutar todas las instrucciones) o se tendría que agregar unas cuantas líneas de código para que el programa funcionara mas como una aplicación convencional.

A cambio de tener pocas líneas, el Hola Mundo 3d con aux tiene pocas prestaciones y aunque se podría mejorar, es mejor seguir con glut.

COMENTARIOS
  1. Comentario por jose .

    Me podrias decir en que parte del codigo del ejemplo se dibuja la tetera, por mas que busco no encuentro de donde se genera la tetera.
    Gracias

  2. Comentario por jotatsu .

    “auxWireTeapot(4.0f): Dibuja una tetera de tamaño 4.0 en la posición actual (0,0,-15.0)” y glutWireTeapot(4.0f);

  3. Comentario por jose .

    oh,
    gracias por la respuesta.

  4. Comentario por jose .

    Mira, tengo una duda. Ejecutando el codigo anterior, y ademas otro codigo que anda por la red de un cubo dentro de un toroide, al momento de minimizar la ventana(de este ejemplo y el del cubo) me arroja un error de una division por cero.
    Si pudieses orientarme por favor.
    Gracias.

    pd: recien comienzo en OpenGl, y esta muy interesante, tengo planeado quizas hacer mi tesis en algo relacionado con esto.

  5. Comentario por jose .

    no se si debo postear aca, si no se debe me avisan, ai esta mi mail,
    el problema de la division por cero lo solucione agregando le estas lineas al codigo (el problema se producia cuando la ventana se minimizaba).

    en la funcion redimencionar agrege:

    if(ancho == 0)
    {
    ancho = 1;
    }

    eso seria ADIOS.

  6. Comentario por jotatsu .

    si, es correcto, tal vez no lo he añadido al código por facilidad o pereza :) , pero gracias por la anotación

  7. Comentario por PEPE .

    ME PRODIAS DECIR CUAL ES LA INSTRUCCION QUE SE NECESITA :? PARA QUE LA TETERA ESTE EN MOMIVIENTO AUTOMATICAMENTE? O SI EXISTE ALGO QUE REALIZE QUE ESTE GIRANDO? :?:


Dejar un comentario

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?: