Campo de Aplicación: Aprendizaje sobre Física
En algunas aplicaciones resulta imprescindible disponer de un “motor físico” para calcular lo que está pasando en tu mundo virtual. Por ejemplo, es muy útil para la programación de juegos o la simulación de robots, existe un motor físico de calidad profesional que tiene una licencia libre y que es multiplataforma: el Open Dynamics Engine (ODE). A continuación se muestran dos ejemplos de utilización del ODE, escritos en C y para plataformas LINUX.
En algunas aplicaciones resulta imprescindible disponer de un “motor físico” para calcular lo que está pasando en tu mundo virtual. Por ejemplo, es muy útil para la programación de juegos o la simulación de robots, existe un motor físico de calidad profesional que tiene una licencia libre y que es multiplataforma: el Open Dynamics Engine (ODE). A continuación se muestran dos ejemplos de utilización del ODE, escritos en C y para plataformas LINUX.
Los ejemplos que se muestran son los más sencillos posibles, los podríamos llamar los “hola mundo” del ODE :
· Gravedad: Se crea un mundo virtual, se sitúa una caja a una cierta altura y se obtiene su posición en función del tiempo (es decir, cómo va cayendo). Es un ejemplo para consola. Este ejemplo se recomienda para probar si se tiene bien instalado el ODE.
· Gravedad + colision: Mismo ejemplo anterior pero ampliado para detectar colisiones. Se sitúa un “suelo” y se repite el mismo experimentos: situar una caja a cierta altura para que caiga. Es también un ejemplo para consola.
· Gravedad: Se crea un mundo virtual, se sitúa una caja a una cierta altura y se obtiene su posición en función del tiempo (es decir, cómo va cayendo). Es un ejemplo para consola. Este ejemplo se recomienda para probar si se tiene bien instalado el ODE.
· Gravedad + colision: Mismo ejemplo anterior pero ampliado para detectar colisiones. Se sitúa un “suelo” y se repite el mismo experimentos: situar una caja a cierta altura para que caiga. Es también un ejemplo para consola.
Es un motor físico para evaluar el movimiento de los robots “gusano”, recolectar datos y aplicar algoritmos genéticos para optimizar el movimiento de los robots.
Estos programas de ejemplo se han probado en una máquina con Debian/Etch. Para instalar el ODE.
Ejemplo “hola mundo” 1: Gravedad
Es un programa para consola, que no utiliza la representación 3D. Se crea un mundo virtual y se sitúa en él una “caja” de una cierta masa y a una determinada altura. Como salida del programa se obtiene un vector con las sucesivas posiciones de la caja según transcurre el tiempo, es decir, como cae en el mundo virtual. No hay ningún suelo por lo que el objeto caerá indefinidamente...
La salida del programa es un script para Octave/Matlab que permite visualizar la gráfica de la caída.
Al ejecutar el programa e
n octave se mostrará la gráfica de la caída de la caja:
Estos programas de ejemplo se han probado en una máquina con Debian/Etch. Para instalar el ODE.
Ejemplo “hola mundo” 1: Gravedad
Es un programa para consola, que no utiliza la representación 3D. Se crea un mundo virtual y se sitúa en él una “caja” de una cierta masa y a una determinada altura. Como salida del programa se obtiene un vector con las sucesivas posiciones de la caja según transcurre el tiempo, es decir, como cae en el mundo virtual. No hay ningún suelo por lo que el objeto caerá indefinidamente...
La salida del programa es un script para Octave/Matlab que permite visualizar la gráfica de la caída.
Al ejecutar el programa e
n octave se mostrará la gráfica de la caída de la caja:Ejemplo “hola mundo” 2: Gravedad y colisión
Este ejemplo es una ampliación del anterior, al que se le han añadido detección de colisiones. Es también un programa para consola, sin representación en 3D.
En el mundo virtual creado se sitúan dos objetos: un plano infinito que hace de suelo y una “caja” situada a una cierta altura sobre el suelo. Al realizar la simulación, la caja caerá hasta que llegue al suelo, donde colisionará y se detendrá. La salida del programa es un programa para Octave/Matlab que permite visualizar la gráfica de la caída.
En el ODE hay que distinguir dos tipos de elementos. Uno son los cuerpos (bodies) que tienen una posición en el espacio, una orientación, una velodiad lineal y una velocidad angular. Los otros son las geometrías, que determinan la “forma” del cuerpo y son sobre las que actúa el sistema de detección de colisiones. Nuestros objetos, por tanto, tendrán dos componentes: el cuerpo y su geometría. Si no estamos interesados en la colisiones no hace falta utilizar las geometrías.
Para detectar las colisiones, es necesario crear un espacio de colisiones, donde situaremos todas las geometrías que queremos comprobar. Está implementado de esta manera en ODE para que la detección sea más rápida.
El ODE es un motor físico de carácter general, que permite a los desarrolladores extender sus funcionalidades. El qué hacer cuando hay una colisión es decisión del programador. Cuando se realizan juegos, puede interesar implementar una rutina de detección de colisiones propia. Sin embargo, en este ejemplo y en la mayoría de los ejemplos que yo he utilizado, lo único que se necesita es un “comportamiento normal”, similar a lo que ocurre en la realidad. Eso lo tenemos que programar nosotros y se incluye en este ejemplo. Lo interesante es que la rutina proporcionada es válida para la mayoría de los usos normales. No hay que re-escribirla para cada aplicación. Un simple “copy & paste” nos valdrá.
Al ejecutar el progr
ama en octave se mostrará la gráfica de la caída de la caja:
Se puede observar cómo la caja se detiene aproximadamente cuando llega a una altura de cero. En realidad se puede apreciar que llega a cero y que luego “sube” un poco. El ODE está diseñado no para obtener valores instantáneos exactos, sino para que el resultado global sea muy parecido a lo que ocurre en la realidad. El tiempo empleado en ODE es “discreto” por lo que se van acumulando errores durante la simulación. El propio motor de ODE los va corrigiendo, como en este caso. La “caja” tiene una cierta altura y su centro de gravedad no llegará a estar en la posición cero, sino un poco más elevado. En la primera caida, se acumula un error que suelo se va corrigiendo.
Si se realiza una simulación con “pasos” más pequeños, los resultados serán más exactos, pero se tardará más tiempo. Consultar la documentación para determinar cómo mejorar la precisión del simulador.
Este ejemplo es una ampliación del anterior, al que se le han añadido detección de colisiones. Es también un programa para consola, sin representación en 3D.
En el mundo virtual creado se sitúan dos objetos: un plano infinito que hace de suelo y una “caja” situada a una cierta altura sobre el suelo. Al realizar la simulación, la caja caerá hasta que llegue al suelo, donde colisionará y se detendrá. La salida del programa es un programa para Octave/Matlab que permite visualizar la gráfica de la caída.
En el ODE hay que distinguir dos tipos de elementos. Uno son los cuerpos (bodies) que tienen una posición en el espacio, una orientación, una velodiad lineal y una velocidad angular. Los otros son las geometrías, que determinan la “forma” del cuerpo y son sobre las que actúa el sistema de detección de colisiones. Nuestros objetos, por tanto, tendrán dos componentes: el cuerpo y su geometría. Si no estamos interesados en la colisiones no hace falta utilizar las geometrías.
Para detectar las colisiones, es necesario crear un espacio de colisiones, donde situaremos todas las geometrías que queremos comprobar. Está implementado de esta manera en ODE para que la detección sea más rápida.
El ODE es un motor físico de carácter general, que permite a los desarrolladores extender sus funcionalidades. El qué hacer cuando hay una colisión es decisión del programador. Cuando se realizan juegos, puede interesar implementar una rutina de detección de colisiones propia. Sin embargo, en este ejemplo y en la mayoría de los ejemplos que yo he utilizado, lo único que se necesita es un “comportamiento normal”, similar a lo que ocurre en la realidad. Eso lo tenemos que programar nosotros y se incluye en este ejemplo. Lo interesante es que la rutina proporcionada es válida para la mayoría de los usos normales. No hay que re-escribirla para cada aplicación. Un simple “copy & paste” nos valdrá.
Al ejecutar el progr
ama en octave se mostrará la gráfica de la caída de la caja:Se puede observar cómo la caja se detiene aproximadamente cuando llega a una altura de cero. En realidad se puede apreciar que llega a cero y que luego “sube” un poco. El ODE está diseñado no para obtener valores instantáneos exactos, sino para que el resultado global sea muy parecido a lo que ocurre en la realidad. El tiempo empleado en ODE es “discreto” por lo que se van acumulando errores durante la simulación. El propio motor de ODE los va corrigiendo, como en este caso. La “caja” tiene una cierta altura y su centro de gravedad no llegará a estar en la posición cero, sino un poco más elevado. En la primera caida, se acumula un error que suelo se va corrigiendo.
Si se realiza una simulación con “pasos” más pequeños, los resultados serán más exactos, pero se tardará más tiempo. Consultar la documentación para determinar cómo mejorar la precisión del simulador.
No hay comentarios:
Publicar un comentario