Inicio > OGRE 3D > Tutorial Básico # 2.1 Un poco más sobre los Entities en Ogre

Tutorial Básico # 2.1 Un poco más sobre los Entities en Ogre

En el  tutorial anterios estuvimos comentando sobre el uso de los constructores mas básicos de Ogre3D, los SceneManager, SceneNode y Entity Objects.  Ahora, a modo de continuación, veremos algunos aspectos para complementar el tutorial anterior.

.

Un poco mas sobre los Entities

.

La clase entidad es bastante extensa y obviamente no lo vamos a cubrir todo aquí, solo estaremos viendo algunos aspectos básicos para comenzar.

Veamos algunas funciones miebros de las Entidades:

Podemos establecer que una Entidad sea visible  o no simplemente llamando a la siguiente función.

Entity:setVisible o Entity:isVisible ( Si se necesita ocultar una Entidad para después mostrarla se recomienda usar este método en lugar de destruir la Entidad)

Para devolver el nombre de la Entidad o el nombre del Nodo de Escena al cual está adjunta nuestra Entidad usamos:

getName o getParentSceneNode respectivamente

.

Un poco mas sobre los nodos de Escena

.

Podemos obtener o establecer la posición de un Nodo de Escena con getPosition y setPosition respectivamente, además podemos mover un objeto respecto a su posición actual usando el método translate.

Los Nodos de Escena no realizan solamente la función de establecer la posición de los objetos, además controlan la escala y la rotación de los mismos. Podemos escalar los objetos mediante la función scale y rotarlos en función de los ejes usando pitch, yaw y roll, además podemos reiniciar toda la rotación aplicada a un objeto mediante resetOrientation. Podemos usar también setOrientation, getOrientation y rotate para rotaciones más avanzadas que no cubriremos por ahora.

Ya estuvimos trabajando con la función attachObject, existen otras funciones que se complementan para manipular los objetos adjuntos a los Nodos de Escena, un ejemplo de esto son las funciones numAttachedObject y getAttachedObject, por otro lado tenemos a detachObject y detachAllObject.

Como todo el posicionamiento y la translación es relativa al Nodo de Escena padre podemos hacer que dos nodos de Escena se muevan juntos de forma sencilla.

.

Vamos al código.

.

Estaremos trabajando con un fragmento del la función createScene del archivo Tutorial2.cpp del Tutorial anterior.

Tendremos algo como esto

mSceneMgr->setAmbientLight(Ogre::ColourValue(1.0, 1.0, 1.0));

Ogre::Entity* ogreHead = mSceneMgr->createEntity(«Head», «ogrehead.mesh»);
Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(«HeadNode»);
headNode->attachObject(ogreHead);

Ogre::Entity* ogreHead2 = mSceneMgr->createEntity( «Head2», «ogrehead.mesh» );
Ogre::SceneNode* headNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode( «HeadNode2», Ogre::Vector3( 100, 0, 0 ) );
headNode2->attachObject( ogreHead2 );

Agreguemos otra cabeza de Ogro (pronto veremos los ejemplos con algo mas que cabezas de ogros), para esto se debe agregar el siguiente código a continuación del anterior.

Ogre::Entity* ogreHead3 = mSceneMgr->createEntity( «Head3», «ogrehead.mesh» );
Ogre::SceneNode* headNode3 = mSceneMgr->getRootSceneNode()->createChildSceneNode( «HeadNode3», Ogre::Vector3( 200, 0, 0 ) );
headNode3->attachObject( ogreHead3 );

Al generar el proyecto se verá algo como esto, tenga en cuenta que debe alejar la cámara con la Tecla S.

Si cambiamos la   línea

Ogre::SceneNode* headNode3 = mSceneMgr->getRootSceneNode()->createChildSceneNode( «HeadNode3», Ogre::Vector3( 100, 0, 0 ) );

por esto

Ogre::SceneNode* headNode3 = headNode2->createChildSceneNode( «HeadNode2», Ogre::Vector3( 200, 0, 0 ) );

Que hicimos aquí???

Sencillo, hemos hecho que headNode3 sea un hijo de headNode2 por lo que si movemos headNode2 entonces headNode3 se moverá junto con él. Ahora si movemos headNode3 que le pasará a headNode2?  pues nada, porque es el padre.

Vamos al código…

Agreguemos esto

headNode3->translate(Ogre::Vector3( 400, 0, 10 ) );

y tendremos algo así

Como se puede apreciar movimos headNode3 notablemente a la derecha. Al ser el hijo de headNode2 a este no le pasó nada, si en cambio movemos headNode2 veamos que pasa.

Eliminamos

headNode3->translate(Ogre::Vector3( 400, 0, 10 ) );

Y en su lugar colocamos esto

headNode2->translate(Ogre::Vector3( 400, 0, 10 ) );

Entonces obtendremos algo así

Como se pudo apreciar al desplazar a la derecha headNode2 y siendo headNode3 su hijo entonces ambos se desplazan.

.

Escalando

.

Veamos ahora como podemos escalar una malla.

Agreguemos lo siguiente al código

headNode->scale( 3, 3, 3 );

Y obtendremos algo así.

.

Rotaciones

.

Es posible rotar objetos usando los métodos yaw, pitch o roll especificando la rotación en Grados o Radianes. Como se aprecia en la figura pitch es la rotación alrededor del eje X, yaw para el eje Y , y roll para el eje Z.  Usando la mano derecha como guía(similar a la regla de la mano derecha en Física) ponga su dedo pulgar apuntando a un eje y rote los dedos restantes . La dirección de la rotación de los dedos indica la rotación positiva alrededor del eje.

Veamos un ejemplo gráfico sobre las rotaciones.

Agregue el siguiente código

headNode->yaw(Ogre::Degree( -90 ) );
headNode2->pitch(Ogre::Degree( -90 ) );
headNode3->roll(Ogre::Degree( -90 ) );

Genere el proyecto y tendrá algo como esto

Aquí pudimos ver claramente las rotaciones usando yaw, pitch y roll.

.

Archivos de Configuración

.

Para terminar este tutorial comentare brevemente sobre los archivos de configuración de Ogre. Básicamente estos controlan que plugins cargar, donde están los recursos, etc.

plugins.cfg Este archivo contiene la información sobre que plugins está usando la aplicación. Si se desea agregar o eliminar es necesario modificar este archivo. Para quitar un plugin simplemente borre la línea correspondiente o sencillamente comente la línea agregando # al principio de la misma. Para agregar un plugin necesita colocar una línea como «Plugin=[PluginName]». Note que no necesita colocar la extension del plugin(.dll por ejemplo) además no tiene que empezar com «RenderSystem» o similares. Es posible también cambiar la ubicación de la carpeta de Plugins usando rutas relativas o absolutas pero nunca variables de entorno como por ejemplo $(variable).

resources.cfg Este archivo contiene una lista de directorios, en los cuales Ogre debe buscar los recursos(scripts, malla, texturas, etc). Igual que pasa con los plugins puedes usar rutas absolutas o relativas pero nunca variables de entorno, además es necesario tener en cuenta que Ogre no busca recursos en los subdirectorios asi que si desea usarlos debe agregar manualmente otra entrada con la ruta.

media.cfg Este archivo le da a Ogre más información acerca de algunos de los recursos. No es muy común estar editando este archivo así que para dudas consulte los foros oficiales de Ogre.

ogre.cfg Este archivo es generado por la configuración de pantalla de Ogre. Este archivo NO DEBE ser distribuido a otras personas cuando comparta la aplicación que desarrolló ya que la configuración es específica de su configuración gráfica.

Consejo:  No edite manualmente este archivo, deje que la pantalla de configuración lo haga todo por usted.

quake3settings.cfg Este archivo se usa con el BSPSceneManager. No es necesario este archivo a menos que esté usando este Gestor de Escena.

Hasta aqui por ahora, con este tutorial ya debe dominar básicamente como trasladar, rotar y escalar los objetos en Ogre.  En el próximo empezamos con las cámaras, luces y sombras.

Desde Cuba un saludo de Cubansephiroth.

Nos vemos…

Si este tutorial te ha servido de ayuda deja tu comentario a modo de agradecimiento.

Categorías: OGRE 3D Etiquetas:
  1. mayitin3
    junio 25, 2010 a las 8:25 pm

    Interesantisimo este tema, veo muchas similitudes entre las terminologias para manipular objetos sobre lo que trabajo pero este ejemplo esta muy bien detallado si sigues asi quiero recibir clases particulares sin dudas, buena suerte mi hermano empezaste con el pie derecho y a todo motor

  2. junio 25, 2010 a las 8:31 pm

    Ni que decir, aqui el maestro es usted que ya tiene en su cuenta un juego de carros completo. Nada que al 3D lo tumbamos de una o de otra mi hermano jaja , esperemos que mis webs obligaciones me dejen tiempo para seguir aprendiendo y compartiendo sobre 3D.

  1. No trackbacks yet.

Deja un comentario