2015-08-11 41 views
7

Piszę program w Javie przy użyciu JBox2D. Muszę znaleźć dokładny punkt kolizji między dwiema teksturami, jeśli i kiedy się zderzają.JBox2D - Znajdź współrzędne kolizji

Mam kod określający, czy zdarza się kolizja, i można oczywiście wywołać identyfikator obiektu kolizji, aby określić, które tekstury są kolizyjne.

Czego nie mogę się domyślić, to jak pobrać rzeczywiste współrzędne samej kolizji. Przeczytałem dokumentację, ale jest to bardzo skomplikowane i nie rozwiązuje tego problemu bezpośrednio.

Oto mój kod:

import org.jbox2d.callbacks.ContactImpulse; 
import org.jbox2d.callbacks.ContactListener; 
import org.jbox2d.collision.Manifold; 
import org.jbox2d.common.Vec2; 
import org.jbox2d.dynamics.Fixture; 
import org.jbox2d.dynamics.contacts.Contact; 


public class MyContactListener implements ContactListener{ 


    //When they start to collide 
    public void beginContact(Contact c) { 

    System.out.println("CONTACT"); 

    Fixture fa = c.getFixtureA(); 
    Fixture fb = c.getFixtureB(); 

    Vec2 posA = fa.getBody().getPosition(); 
    Vec2 posB = fb.getBody().getPosition(); 



} 

public void endContact(Contact c) { 

} 

public void preSolve(Contact c, Manifold m) {} 

public void postSolve(Contact c, ContactImpulse ci){} 

} 

Odpowiedz

1

wiedzieć, gdzie zderzenie się stało, należy wiedzieć, że czasami nie ma tylko jeden punkt kolizji, lecz zbiorem punktów.

extracted from manual

(Obraz uzyskiwany z this manual)

W powyższej instrukcji mówi:

Box2D posiada funkcje obliczyć punkty kontaktowe dla nakładających się kształtów. [...] Te punkty [...] grupują je w różnorodną strukturę. [...]

Zwykle nie ma potrzeby bezpośredniego obliczania kolektorów kontaktowych, jednak najprawdopodobniej wykorzystasz wynik uzyskany w symulacji. [...] Jeśli potrzebujesz tych danych, najlepiej jest użyć struktura [...].

Możesz go wewnątrz klasy Contact c:

public void beginContact(Contact c) { 
    System.out.println("CONTACT"); 

    WorldManifold worldmanifold; 
    worldmanifold = c.getWorldManifold(); 

    for(Vec2 point : worldmanifold.points){ 
     System.out.println("Contact at : [" + point.x + ", " + point.y "]"); 
    } 
} 

Ważne: Nigdy nie stosować tej biblioteki (JBox2D), ale jestem z nim zapoznać (od libgdx najwyraźniej użyć podobny (Box2D)). Nie wiem też, czy JBox2D to Box2D (wersja C++) dla Javy i czy JBox2D i Box2D (libGDX) są w ogóle powiązane. Więc może niektóre metody mogą się zmienić (point.x może być point.getX()).

Można również sprawdzić this site, ale to jest dla C++ (używam ich odpowiedzi, aby odpowiedzieć).