Ich habe die Bullet Physics-Bibliothek erfolgreich in mein Entitäts- / Komponentensystem integriert. Entitäten können miteinander kollidieren. Jetzt muss ich ihnen ermöglichen, mit dem Gelände zu kollidieren, das endlich und würfelförmig ist (denken Sie an InfiniMiner oder den Klon Minecraft ). Ich habe erst gestern angefangen, die Bullet Physics-Bibliothek zu benutzen, also fehlt mir vielleicht etwas Offensichtliches.
Bisher habe ich die RigidBody
Klasse erweitert, um die checkCollisionWith(CollisionObject co)
Funktion zu überschreiben . Im Moment ist es nur eine einfache Überprüfung des Ursprungs, ohne die andere Form zu verwenden. Ich werde das später wiederholen. Im Moment sieht es so aus:
@Override
public boolean checkCollideWith(CollisionObject co) {
Transform t = new Transform();
co.getWorldTransform(t);
if(COLONY.SolidAtPoint(t.origin.x, t.origin.y,t.origin.z)){
return true;
}
return false;
}
Dies funktioniert hervorragend, um zu erkennen, wann Kollisionen auftreten. Dies behandelt jedoch nicht die Kollisionsreaktion. Es scheint, dass die Standardkollisionsantwort darin besteht, die kollidierenden Objekte außerhalb der jeweils anderen Formen, möglicherweise ihrer AABBs, zu verschieben.
Im Moment ist die Form des Geländes nur eine Kiste von der Größe der Welt. Dies bedeutet, dass die Entitäten, die mit dem Gelände kollidieren, nur außerhalb dieser Weltgröße schießen. Es ist also klar, dass ich entweder die Kollisionsreaktion ändern oder eine Form erstellen muss, die direkt der Form des Geländes entspricht. Welche Option ist die beste und wie implementiere ich sie? Vielleicht gibt es eine Option, an die ich nicht denke?
Es ist zu beachten, dass das Gelände dynamisch ist und vom Spieler häufig geändert wird.
quelle
Ich hatte einige Probleme mit der Strategie, die in meiner anderen Antwort implementiert wurde. Kontaktpunkte blieben manchmal hängen, es war etwas hackig, andere Formen als Würfel zu machen, und es erlaubte manchmal Objekten, durch das Gelände zu rutschen.
Anstatt eine der Bullet-Klassen zu ändern oder zu überschreiben, gibt es eine alternative Option zur Verwendung eines integrierten Bullet-Kollisionsobjekts, das das Gelände darstellt. Das
BvhTriangleMeshShape
( doc ) ist eine eingebaute Form, die durch ein Dreiecksnetz dargestellt wird.Dieses Netz kann gleichzeitig mit dem Netz zur Visualisierung der Welt erzeugt werden. Dies bedeutet, dass das Physikobjekt genau mit dem gerenderten Objekt übereinstimmen kann.
Ich erstelle
RigidBody
für jeden Block in meinem Gelände einen. Dieser Körper hat seine Form auf a eingestelltBvhTriangleMeshShape
. Wenn das Gelände geändert wird, baue ich gleichzeitig die visuelle Darstellung des Blocks und die physikalische Form neu auf. Wenn es dann an der Zeit ist, die visuelle Form zu puffern, tausche ich auch die physikalischen Formen wie folgt aus:Dies stellt sicher, dass der Körper ordnungsgemäß entfernt wird und die Kontaktpunkte gereinigt werden. Dann wird die Form geändert und erneut hinzugefügt.
Um das zu generieren,
BvhTriangleMeshShape
muss jeder Block einTriangleIndexVertexArray
( doc ) pflegen . Dies sind im Wesentlichen zwei Byte-Puffer. Eine mit den Positionen der Dreiecksscheitelpunkte und die andere mit den Indizes zum Konstruieren dieser Dreiecke. Dieses Vertex-Array muss beibehalten werden, daBvhTriangleMeshShape
keine Kopie der Daten erstellt wird.Die Verwendung aller integrierten Bullet-Physikklassen ist wahrscheinlich schneller als alles, was ich schreiben könnte, und es läuft tatsächlich sehr schnell. Nach der Umsetzung dieser neuen Strategie habe ich keine Verlangsamung festgestellt.
quelle
Ich bin nicht mit Bullet Physics vertraut, aber ich habe ODE verwendet. Dort gibt es nach dem Ja-Nein-Kollisionstest einen detaillierteren Form-Form-Kollisionstest, der eine Reihe von Kontaktpunkten generiert.
In Ihrem Fall ist Ihre Welt eine Sammlung von Kisten, also können Sie dies tun:
Dies ist nicht die Neudefinition Kollisionsantwort ; Dies ist eine Schicht davor. Die Kollisionsantwort wird vollständig durch die aus der Kollision berechneten Kontaktpunkte bestimmt.
Wie gesagt, ich bin mit Bullet Physics nicht vertraut, daher weiß ich nicht, ob die Architektur dafür geeignet ist.
quelle