2011-05-29 14 views
20

Tengo un b2Body que me gustaría mover en una determinada posición de destino. No quiero usar la función SetPosition. ¿Cómo puedo lograr esto usando:Mover el cuerpo a una posición específica - Box2D

  1. Cambiando las velocidades lineales.
  2. Usando mouseJoint. (La posición de destino es fija. El mouse NO está involucrado.)

Estoy usando Box2DAS3 2.1a. La ayuda en cualquier otro idioma también sería apreciada.

+0

¿te refieres a que está anclado en un punto y quieres que se mueva o quieres que se mueva a un lugar determinado y luego te quedes allí? Por favor, elabore en cualquier caso. – Shannon

Respuesta

41

La manera más simple es utilizar SetPosition/SetTransform(position,angle). Por ejemplo:

body->SetTransform(b2Vec2(0,0),body->GetAngle()) 

Obviamente, el salto instantáneo significa que está subvirtiendo la simulación de la física, pero es la forma más sencilla más directa para establecer la posición de un cuerpo.

Dado que no desea utilizar SetPosition (que es equivalente al código publicado anteriormente), entonces ApplyLinearImpulse con la fuerza adecuada (en función de la masa y la velocidad actual del cuerpo) hará el truco, y es más correcta a partir de una simulación de punto de vista, pero pueden ser más problemáticos efectos secundarios potenciales dados, etc.

de todos modos, iforce2d cubierto SetLinearVelocity ..., y yo añadiría que una junta de ratón es muy útil incluso cuando el "mouse" no está involucrado.

+1

Gracias, cuerpo-> SetTransform (b2Vec2 (0,0), cuerpo-> GetAngle()) lo hizo por mí ... –

+0

Esto es perfecto, gracias. –

+0

¿Por qué no puedo ver la animación después de aplicar esto? Se muestra en la posición determinada como 'setPosition' – TomSawyer

19

La manera más simple sería establecer la velocidad lineal del cuerpo para que cubra la distancia necesaria en un paso de tiempo. p.ej. si el cuerpo necesita mover (2,3) unidades para llegar a la ubicación deseada y tu paso de tiempo es de 60 Hz, puedes establecer SetLinearVelocity (120,180) para un paso de tiempo. En el siguiente paso de tiempo, por supuesto, tendrá que volver a establecer la velocidad en cero para evitar que se dispare en la distancia. El resultado de esto no es muy diferente de si usaste SetTransform, excepto que el CCD funcionará y si hay algo en el camino, será golpeado.

Si no desea que el cuerpo llegue en un solo paso, simplemente limite la velocidad máxima que puede tener.

Si prefiere usar ApplyForce/ApplyLinearImpulse, podría hacer algo similar pero también debe tener en cuenta la velocidad actual del cuerpo. Puede encontrar esta página útil, explica la versión de rotación de esto, pero el principio es el mismo: http://www.iforce2d.net/b2dtut/rotate-to-angle

Cuestiones relacionadas