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.