Clase abstracta que modela formas básicas, proporciona tests de colisión para dichas formas. Más...
#include <shape.h>
Tipos públicos | |
enum | Type { SPHERE = 1, AABB = 2, PLANE = 3 } |
Métodos públicos | |
Shape (const Ogre::String &name="") | |
virtual | ~Shape () |
const Ogre::String & | getName () const |
virtual int | getType () const =0 |
virtual void | applyTransform (Shape *localShape, const Ogre::Vector3 &traslation=Ogre::Vector3::ZERO, const Ogre::Vector3 &scale=Ogre::Vector3::UNIT_SCALE, const Ogre::Quaternion &orientation=Ogre::Quaternion::IDENTITY)=0 |
virtual Shape * | getTransformedCopy (const Ogre::Vector3 &traslation=Ogre::Vector3::ZERO, const Ogre::Vector3 &scale=Ogre::Vector3::UNIT_SCALE, const Ogre::Quaternion &orientation=Ogre::Quaternion::IDENTITY)=0 |
Métodos públicos estáticos | |
static void | configureCollisionDispatching () |
static bool | getCollision (Shape *shapeA, Shape *shapeB) |
Atributos protegidos | |
Ogre::String | _name |
Clase abstracta que modela formas básicas, proporciona tests de colisión para dichas formas.
Shape es una clase virtual pura que modela el concepto de forma: esfera, plano, AABB, OBB...
Las formas compondrán los cuerpos (clase Body). Un objeto del juego está compuesto por una lista de formas y una matriz de transformación.
Es la encargada del collision dispatching. Dados dos punteros a dos formas se encarga de seleccionar el método que comprueba la colisión entre ambas según su clase concreta. Cada tipo de forma cuenta con un identificador y la clase Shape lleva internamente una tabla que relaciona dos tipos de formas con el método que detecta colisiones entre ellos. Por supuesto, debe haber una función para los tipos dados, en caso contrario se produce un error.
Tipos de formas y colisiones implementadas:
Ejemplo de uso:
// Preparamos la tabla del collision dispatching Shape::configureCollisionDispatching(); // Creamos dos formas Sphere* sphereA = new Sphere("sphereA", Ogre::Vector3(0, 0, 0), 5.0); Sphere* sphereB = new Sphere("sphereB", Ogre::Vector3(1, 1, 1), 2.1); // Comprobamos colisiones entre las formas if (Shape::getCollision(sphereA, sphereB)) cout << sphereA->getName() << " ha colisionado con " << sphereB->getName() << endl;
enum Shape::Type |
Shape::Shape | ( | const Ogre::String & | name = "" |
) |
Constructor
name | nombre de la forma |
No puede llamarse directamente ya que es una clase abstracta. Crea una forma con el nombre dado.
Shape::~Shape | ( | ) | [virtual] |
Destructor
virtual void Shape::applyTransform | ( | Shape * | localShape, | |
const Ogre::Vector3 & | traslation = Ogre::Vector3::ZERO , |
|||
const Ogre::Vector3 & | scale = Ogre::Vector3::UNIT_SCALE , |
|||
const Ogre::Quaternion & | orientation = Ogre::Quaternion::IDENTITY | |||
) | [pure virtual] |
localShape | shape en local space a partir de la cual de aplica la transformación. Es imprescindible las dos shapes sean del mismo tipo. | |
position | distancia con respecto al origen en world space | |
scale | tamaño a aplicar | |
orientation | rotación a aplicar |
La forma ahora será la localShape transformada a partir del resto de parámetros. Cada clase Shape debe implementar este método. Las shapes deben ser del mismo tipo, en otro caso, el resultado es indeterminado. La transformación no se puede deshacer.
Implementado en Sphere, AxisAlignedBox y Plane.
void Shape::configureCollisionDispatching | ( | ) | [static] |
Construye la tabla que relaciona dos clases concretas de formas con un método que hace la comprobación de colisiones. Es necesario llamar a este método antes de comprobar cualquier tipo de colisión. La clase CollisionManager debería ser la que llame a este método.
shapeA | forma A | |
shapeB | forma B |
Recibe dos formas de un tipo indeterminado y devuelve si existe colisión entre ambas. Si no existe un método que gestione la colisión entre los tipos concretos de formas dadas se devuelve falso y se avisa del problema.
const Ogre::String & Shape::getName | ( | ) | const |
virtual Shape* Shape::getTransformedCopy | ( | const Ogre::Vector3 & | traslation = Ogre::Vector3::ZERO , |
|
const Ogre::Vector3 & | scale = Ogre::Vector3::UNIT_SCALE , |
|||
const Ogre::Quaternion & | orientation = Ogre::Quaternion::IDENTITY | |||
) | [pure virtual] |
traslation | desplazamiento a aplicar | |
scale | escala de la forma | |
orientation | orientación de la forma |
Implementado en Sphere, AxisAlignedBox y Plane.
virtual int Shape::getType | ( | ) | const [pure virtual] |
Cada clase que herede de Shape debe implementar este método devolviendo el valor correspondiente del enumerado.
Implementado en Sphere, AxisAlignedBox y Plane.
Ogre::String Shape::_name [protected] |