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, OBB = 4 } |
typedef boost::function< bool(Shape *, Shape *) | CollisionCheckFunction ) |
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 void | addCollisionTest (CollisionCheckFunction test, int typeA, int typeB) |
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éí 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éí 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;
typedef boost::function<bool(Shape*, Shape*) Shape::CollisionCheckFunction) |
Test de colisión entre dos tipos de formas. Objeto función de boost que recibe dos punteros a Shape y devuelve bool.
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
void Shape::addCollisionTest | ( | CollisionCheckFunction | test, | |
int | typeA, | |||
int | typeB | |||
) | [static] |
test | objeto función de boost que recibe dos punteros a Shape y devuelve bool. Test de colisión entre las dos formas. | |
typeA | tipo de la primera forma. | |
typeB | tipo de la segunda forma. |
Añade un test de colisión entre dos tipos de formas. Si ya existÃa uno para dicha combinación de formas, se sobreescribe. Sólo es necesario llamar al méí una vez por cada pareja de formas. Internamente ya hace que el test sea recÃproco (A-B y B-A).
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éí. 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, Plane y OrientedBox.
void Shape::configureCollisionDispatching | ( | ) | [static] |
Construye la tabla que relaciona dos clases concretas de formas con un méí que hace la comprobación de colisiones. Es necesario llamar a este méí antes de comprobar cualquier tipo de colisión. La clase CollisionManager debería ser la que llame a este méí.
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éí 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, Plane y OrientedBox.
virtual int Shape::getType | ( | ) | const [pure virtual] |
Cada clase que herede de Shape debe implementar este méí devolviendo el valor correspondiente del enumerado.
Implementado en Sphere, AxisAlignedBox, Plane y OrientedBox.
Ogre::String Shape::_name [protected] |