Ejercicios de uso del motor de físicas Bullet

Anuncio
Ejercicios de uso del motor de físicas
Bullet
Índice
1
Simulacion fisica con Bullet.........................................................................................2
2
Colisiones entre objetos................................................................................................2
3
Importar la maya de colisión........................................................................................ 3
Copyright © 2013-14 Dpto. Ciencia de la Computación e I.A. All rights reserved.
Ejercicios de uso del motor de físicas Bullet
En esta sesión trabajaremos con el proyecto EjercicioBullet que puedes encontrar en
la sección de recursos. En primer lugar importaremos el proyecto en Eclipse. Si lo
ejecutamos veremos un escenario con un molino, una plataforma sobre él, y sobre ella un
cubo que no veremos por quedar fuera de la pantalla, todo ello implementado sobre el
motor gráfico Irrlicht. Vamos a añadir físicas a los objetos de este mundo
1. Simulacion fisica con Bullet
En primer lugar, vamos a definir las propiedades del mundo físico y de los cuerpos
rígidos contenidos en él. Se pide:
a) En la inicialización, crea la configuración del mundo dinámico de Bullet, con un
algoritmo broadphase de tipo Sweep And Prune (SAP) y fuerza de gravedad (0, -10, 0).
b) Dentro del ciclo del juego, actualiza el mundo a partir del delta time. Por el momento
no veremos nada ya que no hay cuerpos definidos.
c) Crea un cuerpo rígido para el cubo de la escena. Lo definiremos como un cuerpo
dinámico, con masa 1.0, y haremos coincidir su posición y tamaño con el cubo gráfico.
Le daremos también un valor de restitución de 1.0, lo vincularemos al nodo gráfico, y lo
añadiremos al mundo.
d) Actualizaremos la posición y orientación del nodo gráfico del cubo a partir de los datos
proporcionados por el motor físico. Esto lo haremos en el método updateDynamicBody
que se define de forma genérica para poder ser aplicado a cualquier objeto. Ejecuta la
aplicación y comprueba lo que ocurre con el cubo.
e) Creamos ahora un cuerpo estático con forma de plano infinito para la plataforma.
Vincularemos el cuerpo con el nodo gráfico, le daremos un valor de restitución de 1.0 y lo
añadiremos al mundo. Vuelve a ejecutar ahora la aplicación para ver el comportamiento
del cubo al caer sobre la plataforma.
f) Dibuja la maya de colisión sobre el escenario. Ayúdate para ello de la clase DebugDraw
proporcionada. Deberás inicializar el módulo de depuración al crear el mundo, y dibujar
la maya en cada iteración del ciclo del juego.
g) Convierte el cuerpo de la plataforma en cinemático, y permite que se mueva utilizando
los cursores. Para ello deberemos implementar el método moveKinematicBody que
accederá y modificará el motion state del cuerpo proporcionado. Prueba a ejecutar la
aplicación y a mover la plataforma (puedes poner la restitución a 0.0 para poder probar
mejor su comportamiento). Dado que el cuerpo pasa a ser cinemático, deberás cambiar su
forma por una caja, ya que la forma de plano infinito está pensada para cuerpos estáticos.
2. Colisiones entre objetos
2
Copyright © 2013-14 Dpto. Ciencia de la Computación e I.A. All rights reserved.
Ejercicios de uso del motor de físicas Bullet
Vamos ahora a centrarnos en las colisiones entre los objetos del mundo definido en el
ejercicio anterior.
a) Comprueba si existen colisiones en el mundo a partir de la lista de manifolds.
Implementa el método hasCollision, para así pintar la plataforma de azul en caso de
que se detecte una colisión.
b) Marca el cubo como cuerpo de tipo sensor. Comprueba ahora lo que ocurre al caer en
la pltaforma.
c) Convierte el cubo en un cuerpo estático. Prueba a mover la plataforma hacia el cubo.
¿Qué ocurre? ¿Detecta la colisión?
d) Convierte ahora la plataforma en un objeto de colisión, en lugar de un cuerpo rígido.
Utiliza el tipo btCollisionObject. En este caso cambia la forma de asignarle su
posición, así que tendrás que implementar el método alternativo moveKinematicObject,
en el que ya no se utiliza un motion state.
*e) Transforma ahora la plataforma en un ghost object (utilizando el tipo
btPairCachingGhostObject). Necesitarás también agregar al mundo un callback de tipo
btGhostPairCallback para que este tipo de objetos funcione correctamente, y definir un
método alternativo hasCollision que sólo tenga en cuenta las colisiones con el ghost
object especificado.
*f) Para finalizar, vamos a cambiar el algoritmo de broadphase por uno de tipo Dynamic
Bounding
Volume
Tree
(btDbvtBroadphase)
con
caché
de
tipo
btHashedOverlappingPairCache.
3. Importar la maya de colisión
Vamos ahora a importar en la aplicación mayas de colisión creadas con la herramienta
Blender. Se pide:
a) Exporta la maya de colisión del escenario del molino con Blender, e impórtala con
Bullet. Vuelve a definir el cubo como objeto dinámico y elimina su propiedad de sensor
para ver su comportamiento al caer al escenario.
b) Tras importar la maya de colisión de Blender, recorre la lista de objetos cargados en el
mundo. En caso de encontrar un objeto btScaledBvhTriangleMesh del cual no se haya
construido su btOptimizedBvh, constrúyelo.
3
Copyright © 2013-14 Dpto. Ciencia de la Computación e I.A. All rights reserved.
Ejercicios de uso del motor de físicas Bullet
4
Copyright © 2013-14 Dpto. Ciencia de la Computación e I.A. All rights reserved.
Descargar