Ir al contenido principal

Vista isométrica en Ogre

Tebía esto en el tintero (¿o debería decir teclado?) desde hace un buen tiempo, pero por una u otra razón (¿o debería decir haraganería?) no lo había hecho.
En esencia, implementar una vista isométrica en Ogre no es tan complicado. Como ya he mencionado, utilizaremos una cámara en modo ortográfico y no perspectivo porque se alcanza un mejor resultado, más similar a la vista isométrica esa que conocemos de viejos títulos que no voy a mencionar.
Para empezar, utilizamos dos nodos. Uno, es el nodo objetivo, el mismo se encarga de desplazar y rotar la cámara. El segundo nodo es el que lleva adjunto el objeto cámara y sigue al nodo objetivo:

camera = sm->createCamera("camera");
camera->setProjectionType(PT_ORTHOGRAPHIC);
//create nodes
sNode=sm->getRootSceneNode()->createChildSceneNode("camTargetNode");
cNode=sNode->createChildSceneNode("camNode",Vector3(0,500,500));
cNode->attachObject(camera);
sNode->setPosition(Vector3(90,60,90));
cNode->setAutoTracking(true,sNode);
cNode->setFixedYawAxis(true);

Hasta aquí muy fácil, ¿no? Vamos a la parte que más asusta al principio: mover y rotar la cámara. No entraré en detalles acerca de cómo hacerlo, cada cual puede adaptarlo a sus necesidades. Rotar es tan fácil como hacer simplemente un yaw al nodo objetivo:

sNode->yaw(Radian(rotacion));

Y el archiconocido scroll es también muy sencillo:

//scroll up
sNode->translate(sNode->getOrientation()*Ogre::Vector3 (0, 0, -50));
//scroll down
sNode->translate(sNode->getOrientation()*Ogre::Vector3 (0, 0, 50));
//scroll left
sNode->translate(sNode->getOrientation()*Ogre::Vector3 (-50, 0, 0));
//and scroll right!
sNode->translate(sNode->getOrientation()*Ogre::Vector3 (50, 0, 0));

Me falta un detalle crucial, que es el escalado. Pero aún no me entiendo bien con las matrices de proyección. Si alguien quiere echarle un vistazo a la implementación, puedo proporcionarle la clase que maneja la cámara en el proyecto.

Comentarios