Hola mundo 3d en OpenGL

Primera Aplicación 3d Usando GLUT

GLUT es el GL Utility Toolkit (herramientas utilitarias GL), desarrollada originalmente por Mark J. Kilgard como un reemplazo para la librería aux, con funcionalidades adicionales, mas estable y con un rango mas amplio de sistemas operativos soportados. Posteriormente la librería fue tomada por otros como Nate Robins quienes realizaron modificaciones y mejoras a la librería inicial.

#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include "glut.h"

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")

void render(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glLoadIdentity();
   glTranslatef(0.0f,0.0f,-15.0f);
   glutWireTeapot(4.0f);
   glutSwapBuffers();
}

void Redimensionar(GLsizei ancho, GLsizei alto)
{
if(alto == 0)
	{
	  alto = 1;
	}

	glViewport(0, 0, ancho, alto);
           glMatrixMode(GL_PROJECTION);
           glLoadIdentity();
	if(ancho>alto)
	{
		gluPerspective(45.0f,ancho/alto,1,150.0f);
	}
	else
	{
		gluPerspective(45.0f,alto/ancho,1,150.0f);
	}

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void main(void)
{
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutCreateWindow("Hola Mundo 3d");
    glutDisplayFunc(render);
    glutReshapeFunc(Redimensionar);
    glutMainLoop();
}

Ahora son 21 líneas de código (sin contar de nuevo las inclusiones ni las declaraciones de funciones), pero ahora la ventana es capaz de responder a los comandos más simples del sistema operativo como cambiar de tamaño, moverse y cerrarse. En la pantalla se vería algo como

Programa GLUT

Las nuevas librerías utilizadas son las de glut.h y glut32.lib, que no vienen incluidas en la distribución del Visual Studio, por lo que es necesario incluirlas “manualmente” bien sea en el compilador y/o en el disco duro (basta colocarlas en la carpeta del proyecto) y en Windows adicionalmente hay que proporcionar las librerías dinámicas glut32.dll si se usa opengl32.lib, la distribución de Microsoft o glut.dll si se usa opengl.lib, la distribución de SGI. Para proporcionar las librerías dinámicas se pueden colocar en la carpeta donde se ejecute el programa o copiarlas a la carpetas WINDOWS/system32/, esta última es mejor si se van a desarrollar varias aplicaciones dependientes de esta librería.

Las líneas de código nuevas son:

En la función render() que se encarga de dibujar los elementos.

  • glClear(GL_COLOR_BUFFER_BIT): Indica que se limpie un buffer con el color actual de limpiado (el color por defecto es negro)
  • glLoadIdentity(): Carga la matriz identidad sobre la matriz actual (modelview), es necesario hacerlo ya que la funcion render() se ejecuta muchas veces, lo que haría que el glTranslate fuera acumulativo si no se cargara la matriz identidad.
  • glutSwapBuffers(): Cambia el buffer actual sobre el que se está dibujando, por defecto el buffer sobre el que se dibuja es el buffer de atrás y el que se muestra es el del frente.
    En la función Redimensionar() que se encarga de cambiar el viewport y el aspecto de la escena cuando el usuario cambia de tamaño la ventana:
  • if(alto == 0){ alto = 1;}: Previene que el alto sea 0, para evitar posteriormente un error de división entre 0.
  • glMatrixMode(GL_PROJECTION); glLoadIdentity(): Cambia el modo de matriz a proyección y luego carga la identidad sobre esta matríz.
  • if(ancho>alto){ gluPerspective(45.0f,ancho/alto,1,150.0f);}: Define el frustrum, en este caso el alto es mayor que el ancho, así que el aspecto es ancho/alto.
  • else{gluPerspective(45.0f,alto/ancho,1,150.0f);} En este caso el aspecto es alto/ancho, ya que la el alto es mayor que el ancho.
  • glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Se elige la matriz MODEL_VIEW y se carga la identidad sobre ella .

Por ultimo este programa también parte del modo consola (como lo muestra la consola de comandos que aparece cuando se ejecuta), las líneas de código en el main() son:

  • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB): Inicializa la ventana con modo doble buffer (uno sobre el que se pinta y otro que se muestra en pantalla) y solicita un modo RGB de colores.
  • glutCreateWindow(“Hola Mundo 3d”): El titulo de la ventana, en este caso “Hola Mundo 3d”.
  • glutDisplayFunc(render); Indica a la librería glut cual será la función que realizará el pintado sobre OpenGL, en este caso es render(), que ya se había definido anteriormente.
  • glutReshapeFunc(Redimensionar): Indica a glut la función que será llamada cuando el usuario cambie el tamaño de la ventana. En este caso la función es Redimensionar() que se había definido anteriormente.
  • glutMainLoop(): Finalmente esta función es el ciclo de glut, donde se realizan la recepción, procesamiento de mensajes del sistema operativo y el dibujado sobre el área OpenGL.

download


Descargar:	holamundoglut.zip
Version:	0.1
Actualizado:	December 22, 2009
Tamaño:		221.91 KB

Y este es todo el “Hola Mundo 3d”. Aún falta hacer la aplicación directamente sobre el sistema operativo, que en el caso de Windows implica el proceso de creación de la ventana y la asociación con OpenGL mediante las funciones wgl, que ayuda a entender mejor la forma en que OpenGL se asocia con un sistema operativo particular.

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