J'ai réussi à intégrer la bibliothèque Bullet Physics dans mon système d'entités / composants. Les entités peuvent entrer en collision les unes avec les autres. Maintenant, je dois leur permettre d'entrer en collision avec le terrain, qui est fini et semblable à un cube (pensez à InfiniMiner ou à son clone Minecraft ). J'ai commencé à utiliser la bibliothèque Bullet Physics hier seulement, alors peut-être que je manque quelque chose d'évident.
Jusqu'à présent, j'ai étendu la RigidBody
classe pour remplacer la checkCollisionWith(CollisionObject co)
fonction. Pour le moment, ce n'est qu'une simple vérification de l'origine, sans utiliser l'autre forme. Je répéterai cela plus tard. Pour l'instant, cela ressemble à ceci:
@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;
}
Cela fonctionne très bien, en ce qui concerne la détection des collisions. Cependant, cela ne gère pas la réponse de collision. Il semble que la réponse de collision par défaut consiste à déplacer les objets en collision en dehors des formes les uns des autres, éventuellement leurs AABB.
Pour le moment, la forme du terrain n'est qu'une boîte de la taille du monde. Cela signifie que les entités qui entrent en collision avec le terrain tirent juste à l'extérieur de cette zone de taille mondiale. Il est donc clair que je dois soit modifier la réponse à la collision, soit créer une forme qui s'adapte directement à la forme du terrain. Alors, quelle option est la meilleure et comment procéder pour la mettre en œuvre? Peut-être y a-t-il une option à laquelle je ne pense pas?
Il est à noter que le terrain est dynamique et fréquemment modifié par le joueur.
la source
J'avais des problèmes avec la stratégie mise en œuvre dans mon autre réponse. Les points de contact restaient parfois autour, c'était une sorte de hacky de faire des formes autres que des cubes et cela permettait parfois aux objets de glisser à travers le terrain.
Ainsi, au lieu de modifier ou de remplacer l'une des classes Bullet, il existe une option alternative d'utiliser un objet de collision Bullet intégré qui représentera le terrain. Le
BvhTriangleMeshShape
( doc ) est une forme intégrée qui est représentée par un maillage triangulaire.Ce maillage peut être généré en même temps que le maillage pour visualiser le monde. Cela signifie que l'objet physique peut correspondre exactement à l'objet rendu.
Je crée un
RigidBody
pour chaque morceau de mon terrain. Ce corps a sa forme définie sur aBvhTriangleMeshShape
. Lorsque le terrain est modifié, en même temps je reconstruis la représentation visuelle du morceau, je reconstruis également la forme physique. Ensuite, quand vient le temps de tamponner la forme visuelle, j'échange également les formes physiques comme ceci:Cela garantit que le corps est correctement retiré, nettoyant les points de contact. Ensuite, sa forme est modifiée et elle est rajoutée.
Afin de générer le
BvhTriangleMeshShape
chaque morceau doit maintenir unTriangleIndexVertexArray
( doc ). Il s'agit essentiellement de tampons à deux octets. L'un avec les positions des sommets des triangles et l'autre avec les indices de construction de ces triangles. Ce tableau de sommets doit être conservé carBvhTriangleMeshShape
ne fait pas de copie des données.Utiliser toutes les classes de physique Bullet intégrées est probablement plus rapide que tout ce que je pourrais écrire, et cela fonctionne en effet très rapidement. Je n'ai vu aucun ralentissement après la mise en œuvre de cette nouvelle stratégie.
la source
Je ne connais pas Bullet Physics, mais j'ai utilisé ODE. Là, après le test de collision oui ou non, il y a un test de collision forme-forme plus détaillé qui génère un ensemble de points de contact.
Dans votre cas, votre monde est une collection de boîtes, vous pouvez donc faire ceci:
Cela ne redéfinit pas la réponse à la collision ; c'est une couche avant ça. La réponse à la collision est entièrement déterminée par les points de contact calculés à partir de la collision.
Comme je l'ai dit, je ne connais pas la physique des puces, donc je ne sais pas si son architecture s'y prête.
la source