2013-05-23 12 views
6

Pracuję nad moją pierwszą grą, używając libgdx z box2d. Używam renderera debugowania do testowania moich obiektów. Stworzyłem trochę samochodów jak obiekty. Każdy samochód ma główną bryłę, która jest dużym wielokątem 6 punktów (około 1 metra długości, 0,7 metra wysokości) i ma 2 koła połączone obrotowymi stawami.Zderzenie w libgdx box2D nie działa dla niektórych organów

Samochód główny ma dołączoną armatę i karabin maszynowy, również za pomocą połączeń obrotowych.

Problem, przed którym stoję, polega na tym, że duża część samochodu nie dokonuje kolizji zgodnie z przeznaczeniem. Kiedy 2 samochody hit siebie, są one pokrywają, tak:

Bodies colliding

Kilka uwag:

  1. Koła i armaty (mniejsze kształty) robią kolizji grzywny. Kiedy koła dotkną ciał zatrzymują się
  2. Jeśli wykryję kolizję za pomocą kodu, kolizja faktycznie się dzieje
  3. Próbowałem tego z mniejszym obiektem (pocisk wystrzelony z karabinu maszynowego) i ustawiłem obiekt "isBullet" "własność na true, jak widziałem w innym poście (not proper collision in box2d), ale miał taki sam wynik (kula jest zakreślona na czerwono):

Bullet object colliding

Oto kod używam, aby stworzyć ciała:

protected Body createBody(Material material, Shape shape, BodyType type, WorldWrapper world) 
{ 
    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = type; 
    bodyDef.position.set(initialPosition); 

    Body body = world.createBody(bodyDef); 

    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.density = this.material.getDensity(); 
    fixtureDef.friction = this.material.getFriction(); 
    fixtureDef.restitution = this.material.getRestitution(); 
    fixtureDef.shape = shape; 
    body.createFixture(fixtureDef); 

    return body; 
} 

Samochód idzie do przodu za pomocą silników na kołach zawinięty stawów, zbudowane tak:

public void goForward() 
{ 
    for (RevoluteJoint joint : wheelJoints) 
    { 
     joint.enableMotor(true); 
     joint.setMotorSpeed(-this.engineSpeed); 
     joint.setMaxMotorTorque(this.engineTorque); 
    } 
} 

Używam następujące wartości:

Density = 2500; 
Restitution = 0; 
Friction = 0.1; 
BodyType = Dynamic; 

używam 1/60 sekundowy światowy krok, z prędkościąIperacje = 6 i positionIterations = 2

Jakieś pojęcie o tym, czego tu brakuje?

Odpowiedz

5

Główna bryła samochodu (wielokąt) jest wklęsła. Box2D ma problemy z wklęsłymi wielokątami lub jeśli wierzchołki są w kolejności zgodnej z ruchem wskazówek zegara. Spróbuj zbudować te samochody z dwoma prostokątami, które powinny działać.

Przy okazji: wydaje się, że używasz starszej wersji libgdx. Obecne nightgies libgdx mają dodatkowy algorytm w funkcji polygon.set, który automatycznie oblicza wypukły kadłub w kierunku przeciwnym do ruchu wskazówek zegara dla podanych wierzchołków. Używanie tej wersji powinno również rozwiązać problem.

+0

Dzięki! Spróbuję tego dzisiaj. Stworzyłem ten projekt 3 tygodnie temu i użyłem funkcji aktualizacji libgdx w pliku wykonywalnym instalacji. Czy zmiany są nowsze? – Charbel

+2

Z tego, co widzę na GitHub, zmiana została dodana 22 marca. Najnowsza wersja wydania libgdx pochodzi z 16 marca, więc obecnie jest tylko w nocnych klubach. – Shinni

+0

Zmieniłem wielokąt, aby miał wypukły kształt i to był problem. Użyję sugestii dwóch prostokątów. Dzięki! – Charbel

Powiązane problemy