Tutorial 2 NxOgre: Volumes y Triggers

26 05 2010

Como en anteriores tutoriales, vamos a exponer una aplicacion para descargar, que es una ligera modificación de tutorial 4 de la wiki de nxOgre.

SRC NxOgre_tutorial2

Lo pimero que vamos hacer es explicar que es un volumen:

Es un tipo de objeto con sus propiedades de posición, orientación entre otras, que a la vista es invisible, pero cuando algun objeto lo atraviesa, se pueden recojer algunos eventos, para realizar alguna operación.

En el ejemplo original de la wiki de nxOgre, se ve como aplicando un impulso a un cubo se ve como hace botes encima de un panel. En nuestro ejemplo hemos modificado dicho codigo, para ver el funcionamiento de dicho volumen y hemos puesto dos uno encima del otro y cada vez que toca arriba creará un cubo nuevo, así hasta 20 cubos.

El trigger no es mas que una clase que hereda de CallBack, que es la encargada de recojer los eventos.

No vamos a explicar aqui todo el codigo, por que eso ya lo hicimos en anteriores post, aqui solo vamos a explicar lo que mas nos interesa.

mVolume = mScene->createVolume(new NxOgre::Box(NxOgre::Vec3(100,1,200)), NxOgre::Matrix44(NxOgre::Vec3(0, 0, 0)), this, NxOgre::Enums::VolumeCollisionType_All);

Este es el comando encargado de crear este volumen, con su Shape (como explicamos anteriormente es la envoltura), su posición, el objeto que hereda de CallBack y la ultima partes le estamos diciendo que tipo de eventos queremos recojer, en este caso son todos.

Este es el metodo encargado de recojer el evento, en este caso lo tenemos en la misma clase.

void NxOgre_tutorial2::onVolumeEvent(NxOgre::Volume* volume, NxOgre::Shape* volumeShape, NxOgre::RigidBody* rigidBody, NxOgre::Shape* rigidBodyShape, unsigned int collisionEvent)
{
if(collisionEvent == NxOgre::Enums::VolumeCollisionType_OnEnter)
{
OGRE3DBody* body = static_cast(rigidBody);

float y = (9.81 * body->getMass()) // counteract gravity
+ (-body->getLinearVelocity().y * body->getMass()) // counteract vertical velocity
+ (10 – body->getGlobalPosition().y * body->getMass()); // Add some force to move it to the top

body->addForce(NxOgre::Vec3(0, y, 0), NxOgre::Enums::ForceMode_Impulse);
}
}

Como vemos aqui se pasan como parametros algunos tipo normalmente usados en este tipo de eventos.

Recojemos el Volumen que ha recibido el evento, con su Shape, tambien recibimos el rigidBody, que es el objeto que ha colisionado, con su Shape y el tipo de colisión.

Recordar que el OGRE3Dbody es una combinación de SceneNode(Ogre) y Actor(NxOgre).

Los tipos de colisiones mas importantes son:

NxOgre::Enums::VolumenCollision_Type_OnEnterOrExit

Para cuando sale o entra dentro del volumen

NxOgre::Enums::VolumenCollision_Type_OnEnter

Cuando ha entado el objeto dentro del volumen

NxOgre::Enums::VolumenCollision_Type_OnExit

Cuando ha salido del volumen

NxOgre::Enums::VolumenCollision_Type_OnPresence

Cuando esta completamente dentro del volumen

Este objeto nos vale para infinadad de cosas, por ejemplo podemos hacer que cuando un objeto pase por algun detrminado lugar, empieze algun sonido o musica, o por ejemplo mostrar un mensaje mmientras un objeto está dentro. Infinidad de cosas.

Seguiremos colocando tutoriales sobre esta fantastica libreria. Hasta la proxima.


Acciones

Information

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: