/***********************************************************************/
/* gravedad.cpp. Juan Gonzalez. Mayo 2006 */
/*---------------------------------------------------------------------*/
/* LICENCIA GPL */
/*---------------------------------------------------------------------*/
/* Ejemplo "hola mundo" del motor fisico ODE (Open Dynamics Engine) */
/* Es un programa para consola, no utiliza representacion en 3D */
/* Se crea un mundo virtual y se situa en el una "caja" de una cierta */
/* masa y a una cierta altura */
/* Como salida del programa se obtiene una funcion que indica como */
/* varia la altura de la caja con el tiempo, es decir, como cae */
/* En el mundo virtual creado NO HAY SUELO, por lo que no hay ninguna */
/* colision. El objeto caera infinitamente... */
/*---------------------------------------------------------------------*/
/* Los datos devueltos se pueden visualizar con Octave/Matlab */
/* Ejemplo de uso: */
/* $ gravedad > func.m */
/* $ octave func.m */
/***********************************************************************/
#include <ode/ode.h>
/*********************************************/
/* Algunas constantes usadas en el programa */
/*********************************************/
//-- Numero de instantes que queremos simular. Este valor se puede
//-- cambiar
#define TICKS 200
//*******************************************
// VARIABLES GLOBALES DEL PROGRAMA
//*******************************************
//-- Identificador para el mundo
static dWorldID world;
//-- El objeto que vamos a colocar. Sera una caja
static dBodyID body;
//-- Contador de cucantos tics de simulacion quedan
static int ticks = TICKS;
/***************************************************************************/
/* CODIGO */
/***************************************************************************/
/********************************************************************/
/* Crear la "caja" */
/* Se define la "caja" usando la API de ODE y se asocia al "mundo" */
/********************************************************************/
void Crear_objeto()
{
dMass m;
//-- Crear el Cuerpo y asociarlo al mundo
body = dBodyCreate (world);
//-- Establecer la posicion inicial. Se pasan las coordenadas x,y,z
//-- En este ejemplo el objeto esta en el origen, a una altura de
//-- 4 unidades
dBodySetPosition(body, 0,0,4);
//-- Establecer la masa del cuerpo
//-- Hay que especificar la masa total y las dimensiones
//-- del cubo. Como masa se toma 0.5 y las dimensiones de la caja
//-- son 0.5 x 0.5 x 0.1. Se pueden poner las que se quiera
dMassSetBoxTotal (&m,0.5,0.5,0.5,0.1);
dBodySetMass (body,&m);
}
/*******************/
/* MAIN */
/*******************/
int main (int argc, char **argv)
{
const dReal *pos;
/********************************************************************/
/* Primero se crea el mundo (esto es como ser Dios). El mundo es */
/* un "contenedor" de objetos */
/* El mundo no sabe nada de como se dibujan los objetos */
/* En este ejemplo el mundo solo tiene una "caja" */
/********************************************************************/
//-- Crear mundo
world = dWorldCreate();
//-- Establecer la gravedad (gravedad terrestres: -9.81)
dWorldSetGravity (world,0,0,-9.81);
//-- Establecer parametro CFM
//-- Normalmente se deja siempre a este valor
dWorldSetCFM (world,1e-5);
//-- Establecer el modo auto-disabled por defecto
//-- Cualquier objeto que se encuentre en reposo se deshabilitara
//-- y no consumira recursos en la simulacion. Normalmente siempre se
//-- activara
dWorldSetAutoDisableFlag (world,1);
//-- Crear la "Caja" y ponerla en el "mundo"
Crear_objeto();
//-- Salida para Octave:
//-- La matriz z es la que se ira rellenando con los valores de la altura
//-- de la caja
printf ("z=[");
/********************************/
/** COMENZAR LA SIMULACION!!!! */
/********************************/
//-- Este es el bucle principal.
//-- Se haran tantos pasos de simulacion como se indican en la
//-- constante TICKS
for (ticks=TICKS; ticks>0; ticks--) {
//-- Realizar un paso de simulacion. Se especifica que resolucion
//-- en unidades de tiempo se quiere para la simulacion
dWorldStep(world,0.01);
//-- Leer la altura del objeto e imprimirla
//-- Pos es el vector de posicion, que tiene 3 componentes:
//-- pos[0] --> x; pos[1]--> y; pos[2] --> z
//-- Solo nos interesa la altura a la que esta la caja (pos[2])
pos=dBodyGetPosition(body);
printf ("%f,",pos[2]);
}
//-- Simulacion finalizada:
//-- Imprimir la ultima posicion e
//-- Imprimir comandos octave para sacar grafica
pos=dBodyGetPosition(body);
printf ("%f];\n",pos[2]);
printf ("t=0:1:%d;\n",TICKS);
printf ("plot(t,z);\n");
printf ("grid on;\n");
printf ("pause;\n");
/************************/
/* FIN DE LA SIMULACION */
/************************/
//-- Destruir el mundo con todos sus objetos (apocalipsis?)
dWorldDestroy (world);
return 0;
}