2012-01-15 12 views
9

Estoy haciendo un juego donde el jugador arrastra un bote con el dedo. Estoy usando Box2D para los aspectos físicos del juego. En particular, estoy usando b2MouseJoint para adjuntar el evento táctil al barco para permitir que el evento táctil arrastre el barco.Simulando la resistencia al agua en Box2D

Pero hay un problema, que la forma en que la embarcación se mueve mientras se arrastra no es realista; simplemente se puede arrastrar en cualquier dirección, donde como en el mundo real, un bote solo puede moverse a lo largo de su longitud y habrá resistencia al agua que dificulta cambiar la dirección del movimiento del bote. Por lo tanto, necesito una forma de simular la resistencia al agua para hacer que el movimiento del barco sea realista.

¿Es posible simularlo en Box2D? La amortiguación lineal y la amortiguación angular simplemente hacen que el bote sea difícil de mover, pero solo quiero que el bote sea fácil de mover en una dirección y solo debe resistir el cambio de dirección.

P.S. No creo que deba publicar mi código para esta pregunta, pero hágamelo saber si desea ver el extracto del código.

+2

¿Ha intentado utilizar la [ecuación de arrastre] (http://en.wikipedia.org/wiki/Drag_equation)? El término del área de la sección transversal * A * cambiará dependiendo de la orientación del barco en relación con su velocidad, que debe hacer lo que usted desee. Y siempre puede estimar * A * con alguna heurística barata. – Rahul

+0

@Rahul, gracias por la pista. He añadido la ecuación de arrastre en el código con algunas técnicas de aproximación (como usar la velocidad frente al ángulo del barco para llegar al área de referencia), puedo ver un poco de resistencia al agua simulada en el último código, pero parece haber algunos movimientos locos cuando el barco choca con el límite mundial. Estoy intentando dar sentido a lo que está mal antes de pedir más ayuda aquí. De nuevo, gracias por la pista. – Lukman

+0

Una solución descarada podría ser crear montones de cuerpos redondos muy pequeños con una masa pequeña para llenar el espacio alrededor del barco. No he probado la viabilidad de esto en términos de física o poder de procesamiento (todavía) y por eso no lo presento como una respuesta adecuada. – Andrey

Respuesta

1

Tengo una sugerencia que puede ser trivial pero requiere muchas partículas y, por lo tanto, tal vez una potencia de procesamiento adicional. Posiblemente podrías crear muchos círculos pequeños con colisión pero no dibujarlos. Entonces obtendrías el efecto simulado del agua, pero no del agua. El tamaño de los círculos determinaría cuántos de ellos necesitarías llenar la pantalla y, por lo tanto, también tu rendimiento. Sé que es un poco una solución de hack, pero puede valer la pena intentarlo. Encontrarías un medio feliz para el tamaño de los círculos que permite un buen rendimiento y una dinámica fluida.

Vaya, parece que alguien ya sugirió esto ... Lo siento.

+0

Desafortunadamente, IMO, esas partículas interferirán con otros objetos físicos que existen en el mundo, así que preferiría no utilizar esta técnica hackish. Gracias por la sugerencia, sin embargo. – Lukman

+0

@Fred Terminé jugando con eso, y fue un gran problema conseguir el equilibrio correcto: los círculos eran demasiado grandes y el movimiento * todo * impedido, o todo era demasiado agotador para mi procesador. Eso sí, lo estaba probando en el puerto JS, que creo que normalmente es un poco más lento. – Andrey

2

Esto no es algo trivial, por lo que una respuesta "completa" es un poco deseable. Here es un enlace a un ejemplo de un automóvil en box2d. Ver el demoreel de ese caballero (la tercera demostración del carrete es la más relevante), y echar un vistazo a su código fuente. Su simulación es un poco más avanzada que lo que necesita lograr, por lo que si puede comprender cómo funciona, no tendrá problemas para crear una versión más simple.

Hay un montón de código (comprensiblemente) en la extensión box2d de dougk16, por lo que puede ser difícil averiguar exactamente cómo funciona su auto. Así que aquí hay un punto de partida simple: quieres simular un cuerpo que pueda moverse hacia delante y hacia atrás, y también girar. Así que esa es una fuerza que se extiende hacia adelante o hacia atrás desde el frente actual del cuerpo de tu bote, y un par que girará el cuerpo hacia la izquierda o hacia la derecha. Esto debería ser todo lo que necesitas para obtener algo que sea genial. Aquí hay algo de pseudocódigo que sería un lugar razonable para iniciar:

if(needs_to_turn) 
{ 
    // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user 
    body.ApplyTorque(turn_direction * boat_torque); 
} 

if(needs_to_move) 
{ 
    // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user 
    body.ApplyForce(facing_vector * boat_force); 
} 

voy a terminar mi respuesta con otra link, esta vez para un tutorial correspondiente. No es tan genial como el script de acción de doug16, pero podría ser más útil para ti, ya que está en formato de tutorial.