Ich habe Probleme beim Implementieren des Kollisionsrückrufs in mein Projekt. Ich möchte eine Erkennung zwischen zwei bestimmten Objekten haben. Ich habe eine normale Kollision, aber ich möchte, dass ein Objekt stoppt oder seine Farbe ändert oder was auch immer, wenn es mit einem anderen kollidiert. Ich habe Code aus dem Bullet-Wiki geschrieben:
int numManifolds = dynamicsWorld->getDispatcher()->getNumManifolds();
for (int i=0;i<numManifolds;i++)
{
btPersistentManifold* contactManifold = dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i);
btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
int numContacts = contactManifold->getNumContacts();
for (int j=0;j<numContacts;j++)
{
btManifoldPoint& pt = contactManifold->getContactPoint(j);
if (pt.getDistance()<0.f)
{
const btVector3& ptA = pt.getPositionWorldOnA();
const btVector3& ptB = pt.getPositionWorldOnB();
const btVector3& normalOnB = pt.m_normalWorldOnB;
bool x = (ContactProcessedCallback)(pt,fallRigidBody,earthRigidBody);
if(x)
printf("collision\n");
}
}
}
Dabei ist fallRigidBody ein dynamischer Körper - eine Kugel und earthRigiBody ist ein statischer Körper - StaticPlaneShape und Kugel berühren earthRigidBody nicht ständig. Ich habe auch andere Objekte, die mit der Kugel kollidieren und es funktioniert gut. Das Programm erkennt jedoch ständig Kollisionen. Es spielt keine Rolle, ob die Objekte kollidieren oder nicht.
Ich habe auch nach Erklärungen des starren Körpers hinzugefügt:
earthRigidBody->setCollisionFlags(earthRigidBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
fallRigidBody->setCollisionFlags(fallRigidBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
Kann mir jemand sagen, was ich falsch mache? Vielleicht ist es etwas Einfaches?
quelle
Antworten:
Ich bin mit JBullet vertraut, aber da es der Java-Port des Originals ist, sollte das Konzept dasselbe sein.
Es schien mir, dass es immer eine Kollision mit Ihrer statischen Ebene und anderen Objekten gibt. Sie müssen jedoch nur bei einer Kollision bestimmter Objekte etwas tun. Was Sie verwenden müssen, ist der Benutzerzeiger der Kollisionsform. Hier ist ein Stück Code von meiner eigenen Engine in Java. Hier ist GameEntity die Klasse, in die ich meine Objekte einpacke, und CollisionListener ist eine weitere Klasse von mir, mit der ich implementiere, was Kollisionen bewirken. Ich übergebe dem Hörer auch normale Positionen und Kollisionen, um ausgefallenere Effekte zu erzielen.
quelle
Minimal lauffähiges Beispiel
Zwei Kugeln, die in Abhängigkeit von der Zeit aus unterschiedlichen Höhen fallen.
Da sie in unterschiedlichen Höhen beginnen, werden sie zu unterschiedlichen Zeiten auf dem Boden aufschlagen.
Wir erkennen den Bodentreffer und drucken aus, welche Kugel wann den Boden berührt hat.
Gnuplot-Visualisierung von stdout:
Siehe wie:
1
X
geht das Grün zu1
Code:
Getestet auf Bullet 2.83, Ubuntu 15.10.
GitHub Upstream: https://github.com/cirosantilli/cpp-cheat/blob/d7b70153b8f86b5864c22fbc6f7005049a93491f/bullet/which_collision.cpp
quelle