miércoles, 23 de enero de 2008

OGRE (V): Trasteando un poco

Para finalizar esta introdución, se profundizará en el manejador de escena y algunas características curiosas. Se mostrará algo de lo que OGRE puede ofrecer. Éste suministra una serie de demos técnicas en las que se puede observar la calidad de los gráficos que es capaz de manejar. Además, existen muchas extensiones que añaden funcionalidad a la librería, de cuyo total se enumerarán las más importantes.

Efecto Old Movie

Continuar leyendo...
Estructura del manejador de escena

El objetivo en un motor de renderizado es proveer una manera fácil y rápida de dibujar la escena en pantalla, ahorrándose así muchos de los engorrosos pasos de configuración de una API de más bajo nivel como puede ser DirectX u OpenGL. Gracias a la estructura de OGRE, esto resulta bastante sencillo. Para comenzar, se pueden distinguir tres elementos básicos: las Entitys, los SceneNodes y los SceneManagers.

Las Entitys o entidades representan todos los objetos que pueden dibujarse en la escena. Se puede pensar en una entidad como cualquier cosa que es representada por una malla 3D. Un robot sería una entidad, un pez sería una entidad, el terreno sobre el que se mueven los personajes también sería una gran entidad. Sin embargo, otros objetos, como las cámaras o las luces, no son entidades. También cabría mencionar que la orientación y la posición no son propiedades propias de las entidades. Esto significa que no se puede poner directamente una entidad en una escena. En lugar de ello, hay que adjuntar la entidad a otra estructura llamada SceneNode, la cual contiene toda la información sobre la ubicación y orientación de la entidad.

Como ya se ha mencionado, los SceneNodes realizan un seguimiento de la ubicación y orientación de todos los objetos que se le atribuyen. Al crear una entidad, no es añadida a la escena hasta que no se le adjunta a un SceneNode. Su función es ser un contenedor de entidades además de otros objetos como cámaras o luces. Además, se pueden crear jerarquías de nodos, es decir, los SceneNodes pueden ser padres de otros SceneNodes. Cabe mencionar que las posiciones de los SceneNodes son relativas a las de sus padres. De esta forma, si un nodo llamado NodoB, que tiene la posición (3,0,0) y su padre, llamado NodoA, que es el nodo raíz y, que, por lo tanto, tiene sus coordenadas en escala absoluta, tiene la posición (2,0,0), la ubicación absoluta del NodoB será la (5,0,0).

Por último, los SceneManagers son los encargados de seguirle la pista a todos los objetos que se dibujan por pantalla. Pueden verse también como los encargados de todo lo que tenga que ver con el dibujo de la escena. Los SceneManagers poseen el nodo raíz de la jerarquía de SceneNodes, de forma que, a partir de él, se puede llegar a cualquier Entity de la escena. Además, los SceneManagers se encargan también del dibujo del terreno, por lo que en él se pueden especificar las características del mundo que se dibujará. Por ejemplo, si se va a realizar un juego de interiores, el SceneManager para ellos es distino que si se trata de uno de exteriores. De hecho, es posible utilizar varios manejadores de escena para un mismo proyecto.

Una cámara es un objeto especial que funciona de forma parecida a un SceneNode. Una cámara tiene funciones como setPosition, yaw, roll y pitch y se puede adjuntar a cualquier SceneNode. Al igual que cualquiera de estos últimos, la posición de una cámara es relativa a la de sus padres. Para todos los movimientos y rotaciones se puede considerar, básicamente, una cámara como si de un SceneNode se tratara. Una de las características propias de las cámaras es que sólo se puede utilizar una cámara a la vez. Es decir, no se puede crear una cámara para ver una parte de la escena, una segunda cámara para ver otra parte y, a continuación, permitir o inhabilitar las cámaras sobre la base de la escena que queremos mostrar. La forma de conseguir esta funcionalidad es crear SceneNodes que actúen como "titulares de la cámara". Estos SceneNodes se colocan en el lugar y momento en el que queremos colocar la cámara. Cuando sea el momento de cambiar la cámara, simplemente le asignamos un determinado SceneNode sin necesidad de hacer nada más.

Cuando se comienza a hacer frente al uso de múltiples cámaras aparece el concepto de Viewport. Esta clase es muy útil en estas situaciones. Para ello, es importante entender cómo OGRE decide qué cámara va a usar cuando se renderiza la escena. Puede darse el caso que varios SceneManagers estén corriendo al mismo tiempo. También es posible dividir la pantalla en varias áreas y tener cámaras para cada una de las zonas de la pantalla (un ejemplo bastante ilustrativo puede ser una partida para 2 jugadores en un juego de consola). Para entender cómo OGRE realiza una escena, basta considerar estos tres constructores: la cámara, el SceneManager, y la RenderWindow. La RenderWindow es la ventana en la que todo se muestra. El objeto SceneManager crea las cámaras para ver la escena. Ahora, se debe decir a la RenderWindow que cámaras debe mostrar en la pantalla y en qué porción de la ventana debe renderizarlas. El área donde se le dice a la RenderWindow que debe mostrar la cámara es el Viewport. En la mayoría de los usos típicos de OGRE, por lo general, será necesaria una sola Cámara, y, por tanto, sólo se dispondrá de un Viewport.

El uso de las sombras en OGRE es relativamente simple. Actualmente se soportan tres tipos:
  • Modulative Texture Shadows. Es la técnica más liviana en el uso de hardware, pero, por consiguiente, menos vistosa. Se realiza un casting de render a textura de sombras que, posteriormente, se aplica a la escena.
  • Modulative Stencil Shadows. Esta técnica renderiza todas las sombras voluménicas como una modoulación después de que todos los objetos no transparentes se hayan renderizado. No es tan liviano como la técnica anterior y tampoco es tan exacta, pero queda mucho más vistosa.
  • Additive Stencil Shadows. Esta técnica renderiza para cada luz las sombras que luego se añaden a la escena. Resulta muy costoso para la tarjeta gráfica porque, para cada luz, deberá realizar un paso adicional de renderizado.

OGRE no soporta sombras por shaders de forma nativa. Si se requieren este tipo de sombras habrá que incluir los programas programas propios de vértices y fragmentos. Hay que recordar que OGRE soportaba tanto Cg, como HLSL y GLSL

Additive Stencil Shadows

Las luces, al igual que las sombras, resultan fáciles de implementar. La clase Luces tienen una amplia gama de propiedades que describen cómo se ve la luz. Dos de las más importantes son el color difuso y el especular. OGRE proporciona tres tipos de iluminación:
  • Punto de luz. Se emite la luz en todas las direcciones.
  • Spotlight. Funciona exactamente igual que una linterna. Se proporciona la posición en la que la luz se enciende y la dirección en la que se quiere iluminar. También se puede modificar el ángulo de la luz y la intensidad del círculo de luz.
  • Direccional. Simula una luz direccional en la lejanía que se proyecta en toda la escena hacia una misma dirección.

En algunos casos, se pueden combinar varias técnicas. Digamos que se quiere simular la luz de la luna. Se podría establecer una única luz ambiental para la escena, pero esto no es del todo realista, puesto que, la luna no ilumina todo por igual (tampoco lo hace el sol). Una forma más eficaz de hacerlo sería fijando una luz direccional y un punto de luz en la dirección que la luna sería más brillante.

Para manejar terreno. La clase SceneManager define el metodo setWorldGeometry que se usa para cargar los archivos de terreno. Estos archivos consisten en represtaciones de mapas de alturas o heightmap para dibujar un terreno con relieves. La textura se le añade con la función WorldTexture también definida en la misma clase.

Para mostrar cielos OGRE ofrece tres diferentes técnicas:
  • SkyBoxes. Consiste en rodear la escena con una caja mostrando un cielo por todas partes, usado, por ejemplo, en juegos de naves en el espacio.
  • SkyDomes. Se trata de media esfera que muestra un cielo más natural pero sólo en la parte superior, ideal para exteriores con terreno.
  • SkyPlanes. Se sitúa en la parte superior un plano de la escena que muestra el cielo. Funciona bien en juegos en los que no se ve el horizonte. Además, interactúa muy bien con efectos de niebla.


Uso del SkyBox


Es posible combinar la niebla con cualquiera de las diferentes técnicas de mostrar cielos, aunque pueden surgir algunos problemas al intentar usarla junto con un SkyBox o un SkyDome. Existen tres tipos distintos de niebla que difieren en su densidad.

Con esto concluimos un primer y muy básico esbozo de los componentes principales en la gestión de la escena. Quedan en el tintero innumerables aspectos gráficos que no se han tratado como pueden ser las animaciones, las quaterniones, los efectos de partículas y los shaders, los cuales, para un primer acercamiento, podrían parecer demasiado ambiciosos. Se deja en manos del lector indagar en profundidad en los entresijos de estos temas más avanzados. Tanto el soporte oficial como el proporcionado por la comunidad es innumerable y existe una gran cantidad de material para todos aquéllos que aun tengan curiosidad.

Efecto Heat Vision


Extensiones para OGRE

Existen muchas herramientas, librerías, wrappers y exportadores para acondicionar OGRE a nuestras necesidades. Esto contribuye a que podamos tener un marco de trabajo lo más personalizado posible y adaptado a la aplicación que se quiera implementar, en lugar de adaptar nuestra aplicación a las funcionalidades que limite nuestro motor. Todas estas ayudas han sido desarrolladas por terceras partes y muchas siguen también la filosofía de código abierto. Algunas de las más representativas son:

Herramientas
  • Visual C++
  • Code::blocks
  • Eclipse
  • Gcc
  • TortoiseCVS
  • OGRE Studio
  • Mesh Viewer
  • OGRE Particle Editor

Librerías y wrappers
  • OgreAL
  • OgreODE
  • OgreNewt
  • OgreBullet
  • CEGUI
  • OgreDotNet
  • MOGRE
  • Ogre4j
  • Phyton-OGRE

Exportadores
  • SoftImage XSI
  • Maya
  • 3D Studio Max
  • Blender
  • Wings 3D
  • Cinema 4D


Aquí concluye la introducción a OGRE 3D. Espero con mucho entusiasmo que el lector haya encontrado interesante su contenido.



14 comentarios:

Anónimo dijo...

Interesantísimo, por supuesto ;)

Una pregunta. En la intro IV, dijo que iba a dedicar una entrada a la instalación del motor bajo Ubuntu. Para cuándo será aproximadamente?

Saludos.

TaMuDo dijo...

Me alegro que te haya parecido interesante.

En la entrada OGRE IV ya incluí el tutorial de instalación en Ubuntu (está justo debajo del de Visual Studio). Ya se que no es tan detallado como el de Windows... pero es que creí que no hacía tanta falta detallarlo tanto, los usuarios de linux ser bastante experimentados. Pero si consideras que hace falta mejorarlo me pondré a ello.

Un saludo

Anónimo dijo...

Muy cierto. Gracias.

No sé por qué me vino la idea que no estaba terminado, o algo por el estilo. Como en el tutorial para Windows hasta dijistes algo de la ventana de renderizado.. pues ahí está.

De todos modos hasta el paso 6 todo ok. El problema lo he expuesto en la misma entrada.

Saludos, y gracias de nuevo ;)

Anónimo dijo...

Me han parecido muy interesantes los 5 articulos, pero me e quedado con ganas de mas, jejeje.

Creo que seria interesante que escribieras alguno mas, como por ejemplo crear una escena simple, el terreno y mover un objeto por ella o algo asi. Es que en español es casi imposible encontrar temas tan bien redactados y expuestos como el tuyo. Pero bueno es solo una sugerencia.

Gracias por esas entradas;).

TaMuDo dijo...

Vaya! No sé si soy merecedor de tanto halago y agradecimiento. Me satisface mucho que los artículos de OGRE hayan tenido tan buena acogida, pero, por el momento, no voy a publicar más. Quizás un poco más adelante. No garantizo nada, aunque tendré en cuenta tu sugerencia :)

En cuanto a lo de la redacción tengo que darle las gracias a Cristina (TLU truxa!), sin su ayuda y supervisión los artículos tendrían más de un fallo garrafal. Gracias wapa!

Eso es todo. Nos vemos por aquí!

Anónimo dijo...

En serio no vas a hacer más? Vaya, ilusiones desvaneciéndose...

Un saludo.

Alberto dijo...

si hicieses más que sepas que tendrias a un lector asegurado =).

Anónimo dijo...

Muy interesantes tus tutoriales, estan muy bien para empezar a aproximarse a Ogre. Yo estoy empezando con ello y la verdad esque tu tutorial me ha valido para organizarme el aprendizaje (lo típico de "no se por donde empezar"). Es una pena que haya tan pocos tutoriales como este en español, que en inglés hay muy buenos, pero hay que dedicarles mas tiempo.

A ver si con el tiempo te animas a poner algunos ejemplos más concretos.

Un saludo!!

Adrian L dijo...

Fantastico tutorial, lo mismo digo, a mi ya me tienes de lector fijo :p

Anónimo dijo...

Hola¡tengo un gran problema
segui todo hasta el ultimo paso ,pero tengo 15 errores como este """""""
'ogre.exe': se cargó 'C:\WINDOWS\system32\ntdll.dll', No se cargaron símbolos. """"""""""
¡¡si alguien save algo digame pls¡¡

Anónimo dijo...

post data :
hace 3 semanas que intento instalarlo y por fin estoy serca¡¡¡
desde ya muchas gracias¡¡¡

Anónimo dijo...

2nda postdata
me holvidava de que no pude descargar el ogre sdk que linkeaste
y vaje uno posterior ,ya lo estoy descargando. pero lo que me preocupa es que no existe esa dll,estoy bajandolas una por una .gracias...

Anónimo dijo...

lo consegui¡¡¡ :
soy el que dejo los mensajes el 25 de abril ,lo instale TODO de nuevo gracias a vos ...y funciono¡¡¡¡¡¡
soy un lector fijo tullo de por vida.te amo ... te amo.
si no podes publicar mas ta todo bien igual ,pero si lo haces soy tu lector fijo.
pstdata: soy favio grion.

Dany Alejandro dijo...

Gonzalo, estoy escribiendo una serie de tutoriales para OGRE (van 7 y sigo), te gustaría ponernos en contacto para crear documentación o al menos para no escribir sobre lo mismo? me puedes encontrar en ogreros.org, soy DanyAlejandro.