Clase base abstracta para el cargado de un modelo. Más...
#include <Model3D.h>
Métodos públicos | |
Model3D (const char *strPath) | |
bool | isModelLoaded () |
void | process (bool bUpdateBBox=false) |
bool | hasAnimations () |
int | numberOfAnimations () |
char * | animationName (unsigned int n) |
bool | setAnimation (unsigned int n, float fSecondsIni=0.0f, float fSecondsEnd=0.0f) |
int | getActualAnimation () |
void | disableAnimation () |
void | advance (float fSeconds) |
void | setAnimationTime (float fSeconds) |
virtual | ~Model3D (void) |
Atributos públicos | |
Vector3 | oSceneMin |
Vector3 | oSceneMax |
Vector3 | oSceneCenter |
Vector3 | oUpdatedSceneMin |
Vector3 | oUpdatedSceneMax |
Vector3 | oUpdatedSceneCenter |
Métodos protegidos | |
virtual void | preProcess () |
virtual void | applyTransformation (float *fMatrix4Data)=0 |
virtual void | unApplyLastTransformation ()=0 |
virtual void | processMesh (const struct aiMaterial *pMtl, const struct aiFace *pFaces, unsigned int nNumFaces, aiVector3D *aVertices, aiColor4D *aColorsByVertexIndex, aiVector3D *aNormalsByVertexIndex, aiVector3D *aTextureCoordsByVertexIndex)=0 |
virtual void | postProcess () |
Atributos protegidos | |
struct aiScene * | _pScene |
SceneAnimator * | _pSceneAnimator |
float | _fSecondsCount |
float | _fSecondsCountIni |
float | _fSecondsCountEnd |
int | _nActualAnimation |
aiVector3D * | _aVertices |
bool * | _aVertexModified |
unsigned int | maxMeshVertices |
bool | _bFirstBBoxUpdate |
Clase base abstracta para el cargado de un modelo.
Es responsable del cargado del modelo, manejo de la animacion y procesamiento de la estructura del modelo. Un modelo esta formado por una estructura jerarquica de nodos. Cada nodo tiene una matriz de transformacion asociada, puede tener varias mallas de vertices y puede tener nodos hijos. Cada malla de vertices esta asociada a un material (incluye textura e informacion de color y luz). La funcion "process()" es la funcion encargada del procesamiento del modelo. Al ejecutarse, primero se ejecuta "preProcess()" para realizar cualquier accion necesaria antes del comienzo del procesamiento del modelo y lo ultimo que se ejecuta es "postProcess()" al final de "process()". Para cada nodo "process()" realiza la transformacion correspondiente llamando a "applyTransformation(float* fMatrix4Data)" donde fMatrix4Data son los valores de una matriz4x4 en formato compatible con OpenGL. Luego de procesado un nodo se llama a "unApplyLastTransformation()" donde se debe deshacer la transformacion del nodo (ej OpenGL: si al hacer applyTransformation se hizo glPushMatrix() y luego se aplico la transformacion, entonces en este caso se debera hacer glPopMatrix para volver al estado anterior a la transformacion). Luego de aplicada la transformacion del nodo, se llama a "processMesh" para realizar las acciones deseadas con los datos del modelo. Los vectores "oSceneMin" y "oSceneMax" representan una Bounding Box alineada a los ejes que contiene al modelo en estado no animado y "oSceneCenter" es el centro de esa Bounding Box. En caso de que se desee el modelo centrado hay que realizar una traslacion de -oSceneCenter. Las clases derivadas deben de encargarse de implementar opcionalmente las acciones de "preProcess()" y "postProcess()" y obligatoriamente de "applyTransformation", "unApplyLastTransformation" y "processMesh". Ver "OpenGLModel" como ejemplo.
Model3D::Model3D | ( | const char * | strPath | ) |
Constructora recibe la ruta al archivo del modelo.
Model3D::~Model3D | ( | void | ) | [virtual] |
Destructora, elimina estructuras auxiliares
void Model3D::advance | ( | float | fSeconds | ) |
Tiempo de avance en segundos para la animacion, en caso de que no haya animacion seleccionada no tiene efecto.
char * Model3D::animationName | ( | unsigned int | n | ) |
Devuelve el nombre de la n-animacion, en caso de que no exista devuelve NULL
virtual void Model3D::applyTransformation | ( | float * | fMatrix4Data | ) | [protected, pure virtual] |
Aplica la transformacion correspondiente al nodo actual procesado. La transformacion es relativa a la transformacion del nodo padre.
fMatrix4Data | arreglo de 16 floating-points que corresponden a una matriz de 4x4. link con explicacion del formato de la matriz http://www.sjbaker.org/steve/omniv/matrices_can_be_your_friends.html |
Implementado en OpenGLModel.
void Model3D::disableAnimation | ( | ) |
El modelo pasa a no tener una animacion seleccionada.
int Model3D::getActualAnimation | ( | ) |
Devuelve la animacion actual seleccionada, -1 en caso de que no haya una animacion seleccionada.
bool Model3D::hasAnimations | ( | ) |
Devuelve true en caso de que el modelo tenga animaciones.
bool Model3D::isModelLoaded | ( | ) |
Retorna si el modelo fue cargado correctamente.
int Model3D::numberOfAnimations | ( | ) |
Devuelve cantidad de animaciones.
virtual void Model3D::postProcess | ( | ) | [inline, protected, virtual] |
Funcion encargada de realizar cualquier accion necesaria luego de terminado el procesamiento del modelo.
Reimplementado en OpenGLModel.
virtual void Model3D::preProcess | ( | ) | [inline, protected, virtual] |
Funcion encargada de realizar cualquier accion necesaria antes del comienzo del procesamiento del modelo.
Reimplementado en OpenGLModel.
void Model3D::process | ( | bool | bUpdateBBox = false |
) |
Procesa el modelo. La funcion "process()" es la funcion encargada del procesamiento del modelo. Al ejecutarse, primero se ejecuta "preProcess()" para realizar cualquier accion necesaria antes del comienzo del procesamiento del modelo y lo ultimo que se ejecuta es "postProcess()" luego de haber terminado el procesamiento. Para cada nodo del modelo se realiza la transformacion correspondiente llamando a "applyTransformation(float* fMatrix4Data)" donde fMatrix4Data son los valores de una matriz 4x4 en formato compatible con OpenGL. Luego de aplicada la transformacion del nodo, se llama a "processMesh" para realizar las acciones deseadas con los datos del modelo para el nodo actual (las posiciones de los vertices son relativas la posicion absoluta del nodo actual). En caso de que el nodo actual tenga hijos se procesan los nodos hijos. Luego de procesado un nodo y sus hijos se llama a "unApplyLastTransformation()" donde se debe deshacer la transformacion del nodo (ej OpenGL: si al hacer applyTransformation se hizo glPushMatrix() y luego se aplico la transformacion, entonces en este caso se debera hacer glPopMatrix para volver al estado anterior a la transformacion).
bUpdateBBox | indica si se calcula nuevamente el bounding box del modelo para la posicion actual de la animacion. |
virtual void Model3D::processMesh | ( | const struct aiMaterial * | pMtl, | |
const struct aiFace * | pFaces, | |||
unsigned int | nNumFaces, | |||
aiVector3D * | aVertices, | |||
aiColor4D * | aColorsByVertexIndex, | |||
aiVector3D * | aNormalsByVertexIndex, | |||
aiVector3D * | aTextureCoordsByVertexIndex | |||
) | [protected, pure virtual] |
Funcion encargada de procesar las mallas de vertices de cada nodo. Es llamada una vez por cada malla de vertices de cada nodo.
pMtl | arreglo de materiales correspondientes a la malla de vertices de la funcion. | |
pFaces | arreglo de triangulos y quads que forman la malla de vertices. | |
nNumFaces | indica cuantos elementos hay en pFaces. | |
aVertices | arreglo de vertices a los que hacen referencia los elementos en pFaces. Los arreglos aColorsByVertexIndex, aNormalsByVertexIndex y aTextureCoordsByVertexIndex contienen informacion de color, normales y coordenadas de textura para cada elemento del arreglo de vertices. Nota: los struct comenzados con aiXXXX son definidos por la libreria Assimp. Para su manipulacion se recomienda ver una implementacion de Model3D de ejemplo o ver documentacion de Assimp. |
Implementado en OpenGLModel.
bool Model3D::setAnimation | ( | unsigned int | n, | |
float | fSecondsIni = 0.0f , |
|||
float | fSecondsEnd = 0.0f | |||
) |
Setea la animacion a utilizar, se puede limitar la ejecucion de la animacion al intervalo comprendido entre fSecondsIni y fSecondsEnd. En caso de que no formen un intervalo valido no se aplica el limite a la animacion. Por defecto fSecondsIni y fSecondsEnd no forman un intervalo valido.
void Model3D::setAnimationTime | ( | float | fSeconds | ) |
Establece el modelo en el tiempo fSeconds de la animacion actual, en caso de que no haya animacion seleccionada no tiene efecto.
virtual void Model3D::unApplyLastTransformation | ( | ) | [protected, pure virtual] |
Desaplica la transformacion correspondiente al nodo actual.
Implementado en OpenGLModel.
Indica el centro del bounding box del modelo en estado original.
Vector maximo del bounding box del modelo en estado original.
Vector minimo del bounding box del modelo en estado original.
Indica el centro del bounding box del modelo en el ultimo momento que se calculo.
Vector maximo del bounding box del modelo en el ultimo momento que se calculo.
Vector minimo del bounding box del modelo en el ultimo momento que se calculo.