2010-07-16 13 views
8

Estoy tratando de experimentar con los motores de física 2D en C++. Hasta ahora, parece que el más popular es Box2D. Desafortunadamente, Box2D es un rígido motor de física del cuerpo y eso realmente no me va a ayudar con lo que quiero probar.Motor no rígido Motores de física 2D en C++

Quiero ser capaz de definir una forma que tiene un número de vértices unidos por resortes, de modo que cuando esta forma colisione con formas rígidas u otras formas no rígidas, su forma será flexible.

Ahora he tratado de pensar en maneras de hacer esto en Box2D utilizando sólo los cuerpos rígidos, pero no siempre parece ser defectos:

  1. Use rectángulos o segmentos de línea para los bordes exteriores de la forma flexible, . Estos colisionarán con otras formas. Desafortunadamente, no son elásticos, por lo que el efecto deseado no se verá.
  2. Cada vértice de la forma podría ser un cuerpo con su propia forma circular pequeña. Estos cuerpos pueden ser unidos por resortes. Esto funcionaría muy bien en términos de la deformación de la forma, pero imagine si la forma aterriza en una espiga rígida y la espiga acaba de pasar entre los vértices. Entonces la forma se atascaría en la punta.

Entonces, ¿cuál es la mejor manera de hacer este tipo de física en C++? Preferiblemente sin tener que escribir un motor de física completo. Tal vez me falta una característica de Box2D. Quizás no sea la elección correcta. Entonces, ¿cuál es la elección correcta?

Respuesta

3

Existen varios paquetes/motores que admiten cuerpos deformables/blandos. Si quieres algo gratis, puedes por ejemplo consultar Phyz, SOFA o Bullet.

Hay un listado detallado en wikipedia. La mayoría de estos están basados ​​en 3D, pero puede adaptarlos a un modelo 2D configurando la escena como un plano.

Happy coding!

0

que no se sabe muy bien cuál es la mejor manera, pero here, casi al final de la página es el código de "muelles".

1

Si solo está buscando deformación, le sugiero que use un modelo de polígono (trimesh) en el que capture las devoluciones de colisiones al cuerpo rígido que representa esa forma. Sobre el punto de colisión, determinaría la cantidad de deformación causada a uno o varios vértices.

Para la no-deformación, sugeriría que cada paso de tiempo debería iterar a través de sus puntos deformados e intentar empujarlos hacia afuera. Supongo que la consulta podría hacerse a través de consultas de esfera muy pequeñas en su mundo de colisión. Eso también requeriría que mantengas una posición "máxima" no deformada.

Este método sería bastante simple de implementar, aunque no sería un "cuerpo blando", que podría ser lo que está buscando. http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/ parece ser una implementación que proporciona el código fuente que tal vez desee examinar.

Cuestiones relacionadas