#### Source code for gravedad.py ####


#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

#***********************************************************************#
#* gravedad.py.  Rafael Treviño. Junio 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.py > func.m                                            *#
#*   $ octave func.m                                                   *#
#***********************************************************************#

import ode
from sys import stdout

#*********************************************#
#* Algunas constantes usadas en el programa  *#
#*********************************************#
##-- Numero de instantes que queremos simular. Este valor se puede
##-- cambiar.
TICKS = 200

##********************************************#
## VARIABLES GLOBALES DEL PROGRAMA           *#
##********************************************#

##-- Identificador para el mundo.
world = None

##-- El objeto que vamos a colocar.
body = None

#***********************************************************************#
#*  CODIGO                                                             *#
#***********************************************************************#

#*********************************************#
#* Crear la "caja"                           *#
#* Se define la "caja" usando la API de ODE  *#
#* y se asocia al "mundo"                    *#
#*********************************************#
def Crear_objeto(): 
	global body, world
	##-- Identificador para la masa.
	m = ode.Mass()

	##-- Crear el Cuerpo y asociarlo al mundo
	body = ode.Body(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
	body.setPosition((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
	m.setBox(0.5, 0.5, 0.5, 0.1)
	body.setMass(m)

#***********************************************************************#
#* MAIN                                                                *#
#* 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"                      *#
#***********************************************************************#
if __name__ == '__main__': 
	##-- Variable de posicion
	pos = None
	##-- Crear mundo
	world = ode.World()

	##-- Establecer la gravedad (gravedad terrestres: -9.81)
	world.setGravity((0, 0, -9.81))

	##-- Establecer parametro CFM
	##-- Normalmente se deja siempre a este valor
	world.setCFM(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
	world.setAutoDisableFlag(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
	stdout.write('z = [')

	#*************************************#
	#** COMENZAR LA SIMULACION!!!!       *#
	#*************************************#
	##-- Este es el bucle principal. 

	##-- Se haran tantos pasos de simulacion como se indican en la 
	##-- constante TICKS
	for ticks in range(TICKS, 0, -1): 

		##-- Realizar un paso de simulacion.
		##-- Se especifica que resolucion
		##-- en unidades de tiempo se quiere para la simulacion
		world.step(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 = body.getPosition()
		stdout.write('%f, '%pos[2])

	##-- Simulacion finalizada:
	##-- Imprimir la ultima posicion e
	##-- Imprimir comandos octave para sacar grafica
	pos = body.getPosition()
	print '%f];'%pos[2]
	print 't = 0:1:%d;'%TICKS
	print 'plot (t, z);'
	print 'grid on;'
	print 'pause;'

	#*************************************#
	#* FIN DE LA SIMULACION              *#
	#*************************************#

	##-- Destruir el mundo con todos sus objetos (apocalipsis?)
	##-- Implícita por Python

[Created with py2html Ver:0.62]

Valid HTML 4.01!