2012-12-28 7 views
7

Mam prostokątne ciało wystrzeliwane z kanonu o kącie 45 stopni. Ciało również obraca się pod kątem 45 stopni i ustawiłem masę na przedniej części ciała.Ciało nie obraca się, aby być skierowanym w dół z grawitacją

Ciało unosi się w powietrzu dobrze, jednak gdy ciało wraca na ziemię, nie obraca się. Czy istnieje sposób, aby strona masy spadła pierwsza?

Przykładem mojego prawdziwego świata jest rzucanie piłki tenisowej ze sznurkiem zawieszonym w powietrzu. Obecnie sznur nie spada za piłką, gdy wpływa na nią grawitacja.

Oto mój „piłka”

Body = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(texture.Width), ConvertUnits.ToSimUnits(texture.Height),100f, postition, this); 
Body.Mass = 1; 
Body.LocalCenter = new Vector2(ConvertUnits.ToSimUnits(Texture.Width), ConvertUnits.ToSimUnits(Texture.Height/2)); 
Body.UserData = this; 
Body.BodyType = BodyType.Dynamic; 
Body.CollisionCategories = Category.All; 
Body.CollidesWith = Category.All; 
Body.IgnoreGravity = false; 
float ang = BarrelJoint.JointAngle; 
Body.Rotation = ang; 

Wtedy to zrobić, żeby go odpalić:

Body.ApplyLinearImpulse(new Vector2((float)Math.Cos(ang) * 100, (float)Math.Sin(ang) * 100)); 

Domyślam jest jakiś Ustawienie lub wyliczenie ja zapominam.

+2

Ciało może się obracać tylko, jeśli masz opór powietrza. Przypuszczam, że twoja symulacja nie modeluje atmosfery. – phoog

+0

@phoog sprawiają, że odpowiedź –

+0

Jak byś poszła o symulacji atmosfery w świecie fizyki farseer? – Jastill

Odpowiedz

1

Dla każdego, kto przeczyta to w przyszłości, udało mi się go rozwiązać.

Zdałem sobie sprawę, że prędkość zmienia się w podobny sposób, jak chciałem zmienić rotację. Dlatego oparłem obrót o prędkość, im więcej grawitacji pociągnie, tym bardziej obiekt obróci się w dół.

W mojej klasie obiektów uaktualnienia, umieścić następującą (uwaga: potencjalnie złych matematyki)

public override void Update(GameTime gameTime) 
    { 
     Vector2 velocity = Body.LinearVelocity; 

     float radians = (float)(Math.Atan2(-velocity.X, velocity.Y) + Math.PI/2.0); 

     Body.Rotation = radians; 

     base.Update(gameTime); 
    } 

i TA DA mamy obracający się przedmiot.

Powiązane problemy