martes, 25 de mayo de 2010

Tutorial NxOgre : Primer contacto


Este tutorial va acompañado e una aplicación con algunas modificaciones del segundo tutorial de la Wiki de NxOgre, interacción con estos cubos y su física y adaptación del los proyectos de la Wiki NxOgre con el BaseApplicaction que genera el OgreWizard del Vc9. En este tutorial abarcaremos el funcionamiento basico de NxOgre, para darle física a nuestros proyectos y así conseguir unos resultados mas llamativos.

Mientras explicamos como funciona brevemente las clases basicas de NxOgre, es coveniente bajar el proyecto del SVN para tener una mayor comprensión de lo que aqui exponemos. El funcionamineto de la aplicación es el siguiente, pulsar los botones:

  • V: Matener pulsado para avanzar en la animación de los cubos
  • P: Para generar mas cubos
  • B: Para que la función del boton Pse pueda borrar y crear dos cubos nuevos o generar cubos, si borrar los anteriores

En este ejmplo tan básico, lo que vemos en como crear un mundo, configurarlo y soltar varios cubos para que tenga un comportamiento acorde a la configuración. Para crear el mundo :

mWorld = NxOgre::World::createWorld();

Para darle configuración:

NxOgre::SceneDescription sceneDesc;
sceneDesc.mGravity = NxOgre::Vec3(0, -9.8f, 0);
sceneDesc.mName = "DemostrSacion FKT";


Una vez creado el mWorld y el SceneDescription, creamos la mScene
mScene = mWorld->createScene(sceneDesc);


//Configuramos el material de la escena
mScene->getMaterial(0)->setStaticFriction(0.5);
mScene->getMaterial(0)->setDynamicFriction(0.5);
mScene->getMaterial(0)->setRestitution(0.1);

Segun wikipedia la frincción es:

Se define como fuerza de rozamiento o fuerza de fricción entre dos superficies en contacto a la fuerza que se opone al movimiento de una superficie sobre la otra (fuerza de fricción dinámica) o a la fuerza que se opone al inicio del movimiento (fuerza de fricción estática).

Según entiendo despues de leer esto, que la StaticFrinction es el rozamiento que tendrá al principio del choque entre dos objetos y la DynamicFriction es el rozamiento durente todo el movimiento del choque.

Restitución:

En una colisión frontal alineada de dos esferas sólidas (como las que experimentan las bolas de billar) las velocidades después del choque están relacionadas con las velocidades antes del choque.

En definitiva es la velocidad con la que se despiden los objetos despues del choque.

// Ahora creamos el systema de renderizado, para entenderlo de alguna manera es la clase que crearemos los objetos de Ogre y todo lo demas relazionado con el.
mRenderSystem = new OGRE3DRenderSystem(mScene);

En los siguientes codigos vemos como crearemos los cubos, pasandole el BoundingBox que envolvera al objetos, la posición y el fichero .mesh. Si queremos obtener un SceneNode de un OGRE3DBody, simplemente haremos esto: mCube->getScebeNode() -> esto que devuelve el un Nodo de Ogre.

mCube = mRenderSystem->createBody(new NxOgre::Box(1,1,1), NxOgre::Vec3(0, 40, 0), "cube.1m.mesh");
mCubeTwo = mRenderSystem->createBody(new NxOgre::Box(1, 1, 1), NxOgre::Vec3(20, 45, 0), "cube.1m.mesh");
mCubeTwo->addForce(NxOgre::Vec3(-800, -200, 0), NxOgre::Enums::ForceMode_Force);

Esta es la parte mas curiosa de esta libreria, creamos un plano con BloodyMesh, pero luego dicho plano lo representamos con Ogre, si comentamos la  parte del codigo de mPlaneNode->... , veremos que el efeco de suelo sigue estando pero sin el objeto vista plano creado.

// (BloodyMess)
mScene->createSceneGeometry(new NxOgre::PlaneGeometry(0, NxOgre::Vec3(0, 1, 0)), Matrix44_Identity);


// (Ogre)
Ogre::MovablePlane *plane = new Ogre::MovablePlane("Plane");
plane->d = 0;
plane->normal = Ogre::Vector3::UNIT_Y;
Ogre::MeshManager::getSingleton().createPlane("PlaneMesh",
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
*plane, 120, 120, 1, 1, true, 1, 3, 3, Ogre::Vector3::UNIT_Z);
Ogre::Entity *planeEnt = mSceneMgr->createEntity("PlaneEntity", "PlaneMesh");
planeEnt->setMaterialName("Examples/GrassFloor");


Ogre::SceneNode* mPlaneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
mPlaneNode->attachObject(planeEnt);

Aqui terminamos explicando lo basico de esta libreria, en los proximos tutoriales explicaremos colisiones con NxOgre.

Hasta la proxima.

No hay comentarios:

Publicar un comentario

Gracias por tu comentario! :)