2010-04-05 10 views
8

Myślę, że skonfigurowałem Box2d, aby uzyskać jakąś maksymalną prędkość dla dowolnego ciała, ale nie jestem pewien. Używam impulsu, takiego jak (100000000, 100000000), a ciało porusza się tak szybko, jak (100, 100) - co wcale nie jest takie szybkie.Box2d: Maksymalna możliwa prędkość liniowa?

Używam portu Box2d XNA C#.

Moja gra jest odgórnym 2d.

Oto niektóre kodu, które mogą być istotne:

private readonly Vector2 GRAVITY = new Vector2(0, 0); 

    public void initializePhysics(ContactReporter contactReporter) 
    { 
     world = new World(GRAVITY, true); 
     IContactListener contactListener = contactReporter; 
     world.ContactListener = contactListener; 
    } 

    public void Update(GameTime gameTime) 
     { 
    // ... 

      worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10); 

    //... 
     } 

Oto przykład kodu, który stosuje impuls:

private void ApplyImpulseFromInput() 
    { 
     Vector2 movementImpulse = new Vector2(); 

     if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f) 
     { 
      movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f) 
     { 
      movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f) 
     { 
      movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f) 
     { 
      movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     model.Body.ApplyImpulse(movementImpulse, model.Position); 
    } 

Jeśli Constants.PLAYER_IMPULSE_CONSTANT jest wszędzie od 1000f do 1000000000f, gracz może poruszać najwyżej od (-120, -120) do (120, 120). Jeśli stała jest mniejsza, np. 1f, gracz będzie poruszał się wolniej.

Kod ten jest używany do ustawiania fizyki na wszystko w świecie gry:

 controller.Model.BodyDef = new BodyDef(); 
     controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static; 
     controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef); 
     controller.Model.Body.SetLinearDamping(10.0f); 

Czyżby tłumienie liniowe? Zmieniłem go z 10.0f na 0, bez efektu.

UPDATE: Weirdness z tłumieniem liniowej: Zrobiłem te obserwacje na organizm, który poruszał się z zastosowania metody impulsowej powyżej:

Linear Damping  Max Speed 
0f     120 
10f     120 
50f     120 
55f     90 
60f     0 
70f     0 
100f     0 
100000f    0 

Dlaczego istnieje zakres czułości w liniowego tłumienia między 50f i 60f?

+0

Kod, który stosuje ten impuls, może być przydatny. –

+0

Przepraszamy. Dodano. –

+0

+1, aby przeciwdziałać temu, kto to głosował. To jest uzasadnione pytanie. – avpx

Odpowiedz

3

Mam ten sam problem z wersją 2.1a Okazało się, że zmiana linii 128 w b2Settings.as może pomóc. Zmiana statycznej stałej publicznej b2_maxTranslation: Number = 2.0 na wyższą liczbę. pewność, że nie jest to właściwy sposób, ale teraz naprawdę nie wiem, jak to zrobić poprawnie.

+0

wow. to dziwne, ale to naprawiło. –

+8

Właśnie wpadłem na ten problem dzisiaj, z wyjątkiem tego, że używałem wersji Box2D w C++. W komentarzach czytamy: "Maksymalna prędkość liniowa ciała. Ta granica jest bardzo duża i służy do zapobiegania problemom numerycznym. Nie trzeba tego dostosowywać."Moja symulacja została ustawiona na 1 piksel równy 1 jednostce Box2D Miałem ten sam problem z ograniczaniem prędkości .. Brzmi jak Box2D lubi, aby utrzymać symulację na mniejszą skalę – don

+0

Tak, możesz to zrobić, ale to nie jest Właściwie, zobacz odpowiedź Roberta –

14

To nie jest sposób, aby rozwiązać ten problem. Powinieneś skalować obiekty podczas tworzenia ich w świecie box2D. Następnie możesz przeskalować informacje, które box2D przywraca do wielkości Twojego świata.

Załóżmy na przykład, że pudełko w moim świecie ma 120 pikseli długości. Jeśli przeskalowałem obiekt o 30 razy, aby mógł on zostać poprawnie zasymulowany przez box2d, wówczas długość mojego pola w świecie box2D miałaby długość 4 "pikseli" (120/30 lub rozmiar obiektu/skali). Teraz załóżmy, że box2D oblicza, że ​​moje pudełko przesunęło 3 "piksele" w świecie box2d. Mógłbym wtedy pobrać te informacje i przeskalować je z powrotem do rozmiaru mojego świata, co oznaczałoby, że pudełko przesunęło się o 90 pikseli (3 * 30). Mam nadzieję, że nie brzmi to zbyt myląco. Zazwyczaj trudno mi się wytłumaczyć.

+0

Miałem ten sam problem i zmniejszanie rozmiaru moich stałych napraw symulacyjnych –

+5

+1 Z podręcznika Box2D: "Box2D jest dostrojony dla jednostek MKS. Zachowaj rozmiar poruszających się obiektów w przybliżeniu między 0,1 a 10 metrów. Podczas renderowania środowiska i aktorów będziesz musiał użyć jakiegoś systemu skalowania. Test Box2D robi to za pomocą transformacji rzutni OpenGL. "Użyj przykładów silnika, np. HelloWorld, aby odwołać się do twoich własnych jednostek. –