¿Cómo integro la física de bala en mi juego?

12

Descargué el archivo de lanzamiento que se encuentra aquí , pero no estoy seguro de por dónde empezar. En mi juego tengo varios oblongos y una esfera, quiero que todos estos choquen entre sí. (Todos tienen mallas y volúmenes delimitadores asociados)

editar - Acabo de darme cuenta de que los cuboides en realidad tienen AABB asociados con ellos. Creo que tendré que cambiar eso al menos.

¿Cuáles son los pasos que debo seguir?

Sir Yakalot
fuente
2
¿Le echó un vistazo al manual en el capítulo 4.4 Integration overview? Sé que es muy espartano, pero describe el proceso básico. Entonces, si mira eso y el código para el ejemplo Demos, entonces no debería tener demasiados problemas.
PeterT
También revise los ejemplos en la carpeta de viñetas, hay un montón de ellos
Maik Semder
@MaikSemder No estaba muy seguro de cómo abrir los específicos. son archivos make linux solamente?
SirYakalot
En realidad, las notas sobre cómo abrir los ejemplos serían increíblemente útiles, entonces podría ver cómo han vinculado las cosas allí. Voy a buscar en Google para esto, pero pensé que debería preguntar mientras pueda.
SirYakalot
Eso depende de qué plataforma seas. Para Visual Studio en Windows hay un archivo .sln para los ejemplos, supongo que eso es lo que usa. Simplemente busque el archivo sln en la carpeta de viñetas.
Maik Semder

Respuestas:

21

Estos son los pasos básicos que deberá seguir:

  1. Primero cree un objeto mundial (es decir btDiscreteDynamicsWorld) para conducir su simulación física.

  2. Ya debería tener una clase como GameObjectesa que tal vez almacene un modelo junto con su cuadro delimitador y su posición / orientación en el mundo. Reemplazar la posición / orientación de información con una instancia de una física cuerpo objeto (es decir btRigidBody) y cuando se representa el modelo, utilizar la información proporcionada por el cuerpo en su lugar. Al crear el cuerpo, deberá proporcionar su forma de masa y colisión que debe coincidir con los volúmenes delimitadores que ya tiene. También he hablado de esto en tu otra pregunta .

  3. Agrega cada uno de los cuerpos de tus objetos de juego al objeto mundial .

  4. Actualice la simulación dando un paso al mundo (es decir, llamando stepSimulationa su mundo).

Y tómese un tiempo para leer el manual, ya que también tiene mucha información.


Editar para abordar el comentario

Me estremezco antes de preguntar, pero ... ¿cómo hago las cosas más básicas, como simplemente incluir los archivos correctos en mi juego? Si necesita detalles, estoy buscando los archivos que se ocuparán de colisiones de cuerpos rígidos. También muchas gracias por la ayuda hasta ahora!

Bueno, parecería por su comentario que nunca antes ha trabajado con bibliotecas externas de C ++. Ha pasado un tiempo desde que hice esto, pero así es como recuerdo el proceso (en Visual Studio).

Para empezar, cito el manual que ya explica lo que necesita:

- #include btBulletDynamicsCommon.h in your source file 
- Required include path: Bullet/src folder 
- Required libraries: BulletDynamics, BulletCollision, LinearMath

Y aquí están los pasos básicos que deberá seguir para cumplir con las condiciones anteriores ...

1. Paso de preparación

En primer lugar, extraiga el archivo que descargó en un directorio conocido, por ejemplo C:\Bullet. Necesitará saber la ruta a esta carpeta más adelante.

Dentro hay dos carpetas a las que deberá hacer referencia en su proyecto. La primera es la srccarpeta que contiene los .harchivos de encabezado que incluirá en su código fuente. El segundo es la libcarpeta que contendrá los .libarchivos de la biblioteca que vinculará a su proyecto. Tenga en cuenta que incluir y vincular son dos cosas diferentes.

Pero la libcarpeta debería estar vacía por ahora, porque todavía no ha construido el motor. Por lo tanto, consulte el manual sobre cómo construir el proyecto usando CMake y Visual Studio, por ejemplo. Está en la página 7.

Después de tener éxito, usted debe tener al menos tres archivos en la libcarpeta: BulletDynamics.lib, BulletCollision.liby LinearMath.lib(supongo que seguirán en el manual). Ahora para hacer la conexión entre Bullet y su proyecto ...

2. Incluir encabezados

En primer lugar, deberá agregar la C:\Bullet\srccarpeta a las opciones de ruta de inclusión de su proyecto. Puede hacerlo en Visual Studio haciendo clic derecho en su proyecto, navegando Configuration Properties -> C/C++ -> General -> Additional Include Directoriesy escribiendo la ruta del directorio allí.

Después de configurar eso, simplemente puede hacerlo #include “btBulletDynamicsCommon.h”en su código. Ese encabezado parece servir como un centro para todas las funciones que necesita.

3. Bibliotecas de enlaces

Finalmente, deberá vincular las bibliotecas mencionadas anteriormente. Frist, bajo Configuration Properties -> Linker -> General -> Additional Library Directoriesañadir la ruta de la libcarpeta, o en otras palabras, C:\Bullet\lib.

Luego, debajo Configuration Properties -> Linker -> Input-> Additional Dependencies, agregue el nombre de las bibliotecas a la lista de dependencias. Separe cada biblioteca con un ;y no olvide la extensión del archivo. Así, por ejemplo, es posible añadir esto al final de la lista: BulletDynamics.lib;BulletCollision.lib;LinearMath.lib.

Después de esto, debería poder construir y ejecutar su proyecto.

David Gouveia
fuente
Me estremezco antes de preguntar, pero ... ¿cómo hago las cosas más básicas, como simplemente incluir los archivos correctos en mi juego? Si necesita detalles, estoy buscando los archivos que se ocuparán de colisiones de cuerpos rígidos. También muchas gracias por la ayuda hasta ahora!
SirYakalot
@AsherEinhorn Comprueba mi edición.
David Gouveia
@AsherEinhorn No hay problema, esto también me hizo tropezar la primera vez que trabajé con bibliotecas C ++ hace un par de años.
David Gouveia
Sí, es una de esas cosas que he evitado hasta ahora, todo el código en mis juegos es mío, pero intentar escribir mi propio motor de física es solo una pérdida de tiempo cuando otras personas lo han hecho mejor que yo Probablemente alguna vez lo hará.
SirYakalot
@AsherEinhorn Sí, no te molestes en escribir tu propio motor de física, incluso si el juego parece simple. La primera vez que utilicé un motor de física fue después de intentar implementarlo yo mismo en un simple juego 2D. Implementé la detección de colisión OBB-OBB usando el teorema del eje de separación, pero cuando llegué al punto donde necesitaba respuesta de colisión, estaba completamente atascado. Luego pensé que podría probar un motor de física (en particular, usé Box2D) y en menos de una hora tenía todo en funcionamiento.
David Gouveia