Hola mundo 3d en OpenGL

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.

#include <windows.h>
#include <stdio.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "GlAux.Lib")
#pragma comment(lib, "glu32.lib")

void main(void)
{
        auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
	auxInitPosition(100,100,640,480);
	auxInitWindow("Hola Mundo 3d");
	glViewport(0,0,640,480);
	gluPerspective(45.0f,640.0f /480.0f, 1.0 ,150.0f);
	glTranslatef(0,0,-15.0f);
	auxWireTeapot(4.0f);
	glFlush();
	getchar();
}

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 640×480.
  • 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 640×480 (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.

download


Descargar:	holamundoaux.zip
Version:	0.1
Actualizado:	December 22, 2009
Tamaño:		120.49 KB

1 2

Compartir esta entrada

DiggReddit
  • 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

  • http://black-byte.com/ 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);

  • jose

    oh,
    gracias por la respuesta.

  • 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.

  • 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.

  • http://black-byte.com/ jotatsu

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

  • 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? ❓

  • luciana

    hola, te hago una pregunta
    tengo entendido que la tetera suele figurar entre los volúmenes básicos porque fue el primer objeto creado a parir de la programación. sabés ómo fue hecha esa programación? necesito los datos para un trabajo. gracias.

  • marian

    me gustaria saber si alguien tiene un juego sencillo en jogl java 3d o donde puedo encontrarlo por fis muchas gracias

  • nolasco

    prodrian poner poner un codigo sobre moviemto de un cubo por sus ejes
    o circulos en mov o circulos rotando alrededor de una elipce

  • eric

    jajajajaja, y xq no pedís la luna tb? venga chicos.. moveros por la red un poco… y leer

  • Raulon

    hola amigo una consulta no se si me podrias ayudar a facilitarme codigo de animales hechos con OpenGl cualqier animal mnos loro y peces porq ya los tengo si gracias mi correo es walopx@hotmail.com helpme!!!!!

  • http://argenis viry

    hola!!!!1 alguien me podria decir cual es el codigo de la tetera xfavor????????